86. Partition List

86. Partition List

题目

给出一个链表和一个键值x,将小于x的所有结点排在大于等于x的结点之前。你应该保持这两部分的原始相对顺序不变。
比如:
给出 1->4->3->2->5->2 and x = 3,
返回 1->2->2->4->3->5.

代码块

/**
 * 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) {
        if(head == null) return null;
        ListNode dummyLeft = new ListNode(0);
        ListNode left = dummyLeft; //left已经被初始化。
        ListNode dummyRight = new ListNode(0);
        ListNode right = dummyRight;
        while(head != null){
            if(head.val < x){
                left.next = new ListNode(head.val);//新建一个结点,将满足要求的放进去。
                left = left.next;
            }else{
                right.next = new ListNode(head.val);
                right = right.next;
            }
            head = head.next;//忘记
        }
        left.next = dummyRight.next;
        return dummyLeft.next;
    }
}

代码分析

解题思路:
本题思路很明确,先将比x小的排在一起,然后将大于等于x的排在一起,再将大于等于x的放到小于x的后面就可以。

出现的问题:
本题在默写时,遇到的失误:将left.next = new ListNode(head.val),写错成“dummyleft = head”,出现这个问题是因为第一没有好好理解dummy的含义,dummy是哑变量,是静态的,设置后就不要变了。第二,之前的代码只涉及了left,所以,是需要将新的结点放在left后时,需要new一个新的结点。

因为涉及到头结点的移动, 所以要设置dummy变量作为头结点的前驱结点。比如head=dummy;就像是拉拉链,对齐的过程。
这是链表中经常会遇到的问题:链表的第一个结点(node),没有前驱结点,防止该node需特殊处理,会导致额外的代码量。如果创建一个dummy,将其作为第一个node的前驱结点,这样链表中所有node都可以用同样的逻辑来处理了。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Irving_zhu/article/details/79961497
个人分类: Java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭