链表中的经典面试题
链表操作是面试中的高频考点,尤其是涉及指针移动、环检测和结构变换的问题。今天我们来深入探讨几个典型场景,重点在于边界条件的处理和代码的健壮性。
1. 链表分割
题目要求:不能改变原数据顺序,将小于 x 的节点放在前面,大于等于 x 的放在后面。
思路分析: 我们可以维护两条新链表,一条存放小于 x 的节点(bs/be),另一条存放大于等于 x 的节点(as/ae)。遍历原链表时,根据 val 值尾插到对应链表中。最后将两条链表连接起来。
这里有个细节要注意:当第一条链表为空时,直接返回第二条链表;连接完成后,务必将新链表的尾部置为 null,否则可能形成死循环。
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) { this.val = val; }
}
public class Partition {
public ListNode partition(ListNode pHead, int x) {
ListNode bs = null, be = null;
ListNode as = null, ae = null;
ListNode cur = pHead;
while (cur != null) {
if (cur.val < x) {
if (bs == null) {
be = bs = cur;
} else {
be.next = cur;
be = cur;
}
} else {
if (as == ) {
ae = as = cur;
} {
ae.next = cur;
ae = cur;
}
}
cur = cur.next;
}
(bs == ) as;
be.next = as;
(as != ) {
ae.next = ;
}
bs;
}
}


