题目:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
示例:
思路:
先确定大体解决思路:定义两个逻辑上的链表( ans1 和 ans2),ans1 存小于 x 的结点,ans2 存大于 x 的结点。最后找到 ans1 的最后一个结点,将其 next 指向 list2 进行合并即可。
具体实现:
1. 要进行整个链表结点的遍历,所以循环条件为 cur != null 。
2. 需要尾插操作,所以为了避免空指针异常,要分别定义两个工具结点,分别为 ans1 和ans2 的头结点和尾结点,头结点用来进行最后的合并,尾结点用来进行尾插结点。(这样使用工具结点,既可以方便操作,也可以避免特殊情况的出错)。
3.画图理解主要操作:
这里直接使用 ans1 和 ans2 直接定义为头结点,最后直接返回 ans1.next 即可。
代码:
public ListNode partition(ListNode pHead, int x) {
ListNode ans1 = new ListNode(0); //传入0是因为原题只有这一个构造方法
ListNode last1 = ans1;
ListNode ans2 = new ListNode(0);
ListNode last2 = ans2;
ListNode cur = pHead;
while (cur != null){
ListNode next = cur.next;
if (cur.val < x){
cur.next = null;
last1.next = cur;
last1 = cur;
cur = next;
}else{
cur.next = null;
last2.next = cur;
last2 = cur;
cur = next;
}
}
last1.next = ans2.next;
return ans1.next;
}