题目
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
分析
用一个指针pre始终记录最新的比x小的结点,然后用一个指针不停的往后遍历,如果发现比x大则遍历即可,如果比x小,则将该结点放到pre结点的后面即可
public class LinkNode {
int val;
LinkNode next;
public LinkNode(int data) {
this.val = data;
this.next = null;
}
}
public class LinkList {
LinkNode head;
public LinkList() {
this.head = null;
}
public LinkNode getHead() {
return this.head;
}
//添加元素
public void addNode(int data) {
LinkNode node = new LinkNode(data);
if (this.head == null) {
this.head = node;
} else {
LinkNode cur = this.head;
while(cur.next != null) {
cur = cur.next;
}
cur.next = node;
}
}
//正序打印
public void print(LinkNode node) {
while(node != null) {
System.out.print(node.val);
System.out.print(" ");
node = node.next;
}
System.out.println();
}
public void swap(int x) {
LinkNode dummy = new LinkNode(-1);
dummy.next = this.head;
LinkNode pre = dummy;
while(pre.next != null && pre.next.val < x) {
pre = pre.next;
}
LinkNode cur = pre.next;
while(cur != null && cur.next != null) {
if(cur.next.val < x) {
LinkNode p = cur.next;
cur.next = p.next;
p.next = pre.next;
pre.next = p;
pre = pre.next;
} else {
cur = cur.next;
}
}
print(dummy.next);
}
}
public class partitionList {
public static void main(String[] args) {
LinkList list = new LinkList();
list.addNode(1);
list.addNode(4);
list.addNode(3);
list.addNode(2);
list.addNode(5);
list.addNode(2);
list.swap(3);
}
}