题目描述:
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
为了解决这个问题,我们可以使用两个指针和四个辅助指针来追踪链表的不同部分。下面是解决方案的详细步骤:
- 初始化四个辅助指针
bs
、be
、as
和ae
,它们分别表示小于x
的节点段的起始指针、结束指针,以及大于等于x
的节点段的起始指针、结束指针。初始化它们为null
。ListNode bs = null; ListNode be = null; ListNode as = null; ListNode ae = null;
初始化当前指针
cur
为头指针pHead
。ListNode cur = head;
遍历链表,直到
cur
变为null。
while (cur != null) {
如果
cur
的值小于x
,则将其添加到小于x
的节点段中:if (cur.val < x) { if (bs == null) { bs = cur; be = cur; } else { be.next = cur; be = be.next; } }
否则,将其添加到大于等于
x
的节点段中:else { if (as == null) { as = cur; ae = cur; } else { ae.next = cur; ae = ae.next; } }
更新
cur
为下一个节点,即cur = cur.next
。cur = cur.next;
在遍历结束后,根据两个节点段的情况进行连接:
// 有可能不会同时存在小于x 和 大于等于x 的数据 if(bs == null) { return as; } //第一段不为空 be.next = as; //第2个段为空不为空的问题 if(as != null) { ae.next = null; }
返回小于
x
的节点段的头指针bs
,作为重新排列后链表的头指针。return bs;
使用以上步骤,我们可以实现将小于给定值
x
的节点排在其余节点之前的功能,并返回重新排列后的链表的头指针。完整的代码如下:
class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public class Solution { public ListNode partition(ListNode head, int x) { ListNode bs = null; ListNode be = null; ListNode as = null; ListNode ae = null; ListNode cur = head; while (cur != null) { if (cur.val < x) { if (bs == null) { bs = cur; be = cur; } else { be.next = cur; be = be.next; } } else { if (as == null) { as = cur; ae = cur; } else { ae.next = cur; ae = ae.next; } } cur = cur.next; } if (bs == null) { return as; } be.next = as; if (as != null) { ae.next = null; } return bs; } }