前言
保持dummy大法对链表的敏感性。对应链表,非头节点和头节点的处理方式不统一让人头疼,而给每个链表头加一个非node的哑节点,可以很方便的操作链表。
一、分隔链表
二、dummy大法
package com.xhu.offer.everyday;
// 分割链表
public class Partition {
/*
target:把node.val <= x 的节点放到前面去。
遍历原链表,寻找node.val <= x的节点,把它在原链表中删除,并放在新链表中。最后把原链表剩下的部分放到新链表后面。
为了把所有节点都当作非头普通节点,采用dummyNode的方式来统一处理。
*/
public ListNode partition(ListNode head, int x) {
ListNode newDummyHead = new ListNode();
ListNode newCurNode = newDummyHead;
ListNode dummyHead = new ListNode(0, head);
ListNode curNode = dummyHead;
while (curNode.next != null) {
if (curNode.next.val >= x) {
curNode = curNode.next;
} else {
// 删除符合条件的节点。
ListNode node = curNode.next;
curNode.next = node.next;
// 把该节点合并到新链表中。
newCurNode.next = node;
newCurNode = node;
//
}
}
// 将旧链表的节点接到新链表后面。
newCurNode.next = dummyHead.next;
// 返回最终的新链表。
return newDummyHead.next;
}
}
// Definition for singly-linked list.
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
总结
1)dummy大法
参考文献
[1] LeetCode 分隔链表