穷举所有情况,链接节点
人很蠢,看到题解有人用两个链表,一个链接小的数,一个链接大的数,最后拼接起来就是答案。很妙。但是想不出来,直接讨论出所有情况
1.当最开始就是小于的数的时候,也就是cur==head这个时候需要单独出来讨论。因为我们要保证cur和pre是前后的关系,中间不能有节点。如果不分离出来讨论,和cur!=head的情况使用同一份代码(也就是在链表中间遇到比key小的值的情况) 。会出现cur和pre之间多一个节点。最终导致结果直接为空
2. 剩下的就是理清几个指针的指向关系。暴力还是很容易的,想不出简单办法🤡
3. 一般做链表题还是设置一个虚拟头节点,感觉想起来更容易一点,不然讨论的情况会变得复杂
public class Partition {
public ListNode partition(ListNode pHead, int x) {
// write code here
if(pHead == null) {
return null;
}
ListNode head = new ListNode(0);//虚拟头节点,方便一点
ListNode resHead = head;//返回节点
head.next = pHead;
ListNode cur = head;
ListNode pre = cur.next;
while(pre != null) {
if(pre.val < x){
if(cur == head){
pre = pre.next;
cur = cur.next;
head = cur;
}else{
ListNode tmp = pre;
cur.next = tmp.next;
tmp.next = head.next;
head.next = tmp;
head = tmp;
pre = cur.next;
}
}else{
cur = cur.next;
pre = pre.next;
}
}
return resHead.next;
}
}



京公网安备 11010502036488号