力扣 86. 分隔链表

力扣 86. 分隔链表

image.png

image.png

错误的方法:我一开始套用数组排序的方法,想着把小于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;
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注