• 双指针 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;
        }
    }
  • 相关阅读:
    2016第5周四
    2016第5周三
    2016第5周二
    HTTP2.0那些事
    2016第4周日
    【C语言的日常实践(十二)】命令行参数
    Oracle改变字段类型
    Codeforces Round #269 (Div. 2)
    linux shell 命令
    Codeforces Round #256 (Div. 2) C. Painting Fence 或搜索DP
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13824960.html
Copyright © 2020-2023  润新知