Java 链表经典面试题实战
一、链表中的经典面试题
1.1 链表分割
题目要求在不改变原数据顺序的前提下,将链表中小于 x 的节点放在前面,大于等于 x 的节点放在后面。核心思路是维护两个链表:一个存储小于 x 的节点(bs/be),另一个存储大于等于 x 的节点(as/ae)。遍历原链表时,根据 val 值尾插到对应的链表中。
需要注意几个关键点:
- 首次插入:当第一条链表为空时,头尾指针都指向当前节点。
- 连接链表:最后需要将小值链表的尾部连接到大于等于 x 链表的头部。
- 断环处理:如果所有节点都小于 x,返回 as;否则必须将新链表的最后一个节点 next 置为 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;
}
} {
(as == ) {
ae = as = cur;
} {
ae.next = cur;
ae = cur;
}
}
cur = cur.next;
}
(bs == ) as;
be.next = as;
(as != ) ae.next = ;
bs;
}
}


