双指针 86. 分隔链表(链表 dummyhead)

 

 由于之前做过不少链表的题,对这个题目可以说很快就有了思路。

另外,链表的题不就是指针指来指去吗,这样说都算指针题了

维护两个链表beforeEnd和afterEnd,分别指的是小数尾端和大数尾端

另外的beforeHead和afterHead只需要最开始的时候保存一下(做一个引用)就行了

这里又使用了常用的dummyhead技巧,首先设置一个类似索引为-1的节点,到时找只需要找dummyhead.next就行了,就算没有值,那next就是null,非常巧妙。如果这里初始设置为null的话,还要进行特判,否则会出现null.next的error

还有个重要的点就是,要记得最后afterEnd.next=null;这点一开始忘记设置了,因为这个本来的next可能指向其他的元素。

以下放上代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode beforeEnd=new ListNode(-1);//小数尾端
        ListNode beforeHead=beforeEnd;//小数开头
        // ListNode P1=head;//用于遍历的指针
        ListNode afterEnd=new ListNode(-1);//大数的尾端
        ListNode afterHead=afterEnd;//大数的开头

        while(head!=null)
        {
            if(head.val<x)
            {
                beforeEnd.next=head;
                beforeEnd=head;
                head=head.next;
            }
            else
            {
                afterEnd.next=head;
                afterEnd=head;
                head=head.next;
            }
        }
        afterEnd.next=null;//这个很重要忘记设置了
        //连接起两段
        beforeEnd.next=afterHead.next;//P3可能为null,不过那也没关系。P2可能为我设的假值,不过也没关系
        return beforeHead.next;
    }
}

 

posted @ 2020-10-16 10:13  将来的事  阅读(172)  评论(0编辑  收藏  举报