力扣 86. 分隔链表
错误的方法:我一开始套用数组排序的方法,想着把小于x的元素都两两交换,但是这道题的数据结构是链表,所以无法倒序遍历。另外这道题采用链表就是想考察链表的相关增、删、改的操作。接下来是正确的方法。
正确的方法:
定义两个头节点,分别保存比x小的元素的节点以及大于等于x的节点,当然这两个头节点都需要用另外两个节点实现各自分区的遍历。接下来就很容易,遍历原始的链表,遇到比x小的节点就加入到左分区,遇到比x大的节点就加入到右分区。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if(head==null||head.next==null)return head;
ListNode xleft=new ListNode();
ListNode tmpleft=xleft;
ListNode xright=new ListNode();
ListNode tmpright=xright;
while(head!=null){
if(head.val < x){
tmpleft.next=head;
head=head.next;
tmpleft=tmpleft.next;
tmpleft.next=null;
} else {
tmpright.next=head;
head=head.next;
tmpright=tmpright.next;
tmpright.next=null;
}
}
tmpleft.next=xright.next;
return xleft.next;
}
public void swap(ListNode a, ListNode b){
int c=a.val;
a.val=b.val;
b.val=c;
}
}