码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode:Partition List 链表快速排序划分

时间:2014-06-12 06:18:55      阅读:562      评论:0      收藏:0      [点我收藏+]

标签:des   style   class   blog   code   java   

Partition List

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

For example,
Given  1->4->3->2->5->2 and x = 3,
return 1->2->2->4->3->5.

 

解题分析:

顺序遍历原链表,每遇到一个小于x的结点,我们将它从原链表摘除,并采用尾插法插入到新的结果链表中

bubuko.com,布布扣
class Solution {
public:
    ListNode *partition(ListNode *head, int x) {
        if (head == nullptr) return nullptr;
        ListNode* newHead = new ListNode(0);
        newHead->next = head;
        
        ListNode* resHead = new ListNode(0);
        ListNode* resCur = resHead;
        
        ListNode* cur = newHead;
        while (cur->next != NULL) {
            if (cur->next->val < x) {
                ListNode* nextNode = cur->next;
                cur->next = nextNode->next; // 删除结点
                resCur->next = nextNode; // 尾插法
                resCur = nextNode;
                
            } else {
                cur = cur->next;
            }
        }
        resCur->next = newHead->next;
        return resHead->next;
    }
};
bubuko.com,布布扣

原链表第一个结点也可能小于x,可是我们每删除一个结点都需要知道该节点的前驱结点,这时碰到了 操作头节点和其余结点不统一的情况

我们仍然是 虚拟一个前置结点,该节点指向原链表第一个节点

主要注意:

1. 我们将cur->next结点值与x进行比较,因为每删除一个结点都需要知道该节点的前驱结点

2. 每遇到一个满足要求的结点时,我们删除该节点,并尾插法插入到新的结果链表,此时 当前结点不能向前移动

比如 6-->2-->3-->8  删除小于5的结点,我们cur指向结点6,删除结点2之后,cur不能向前移动,如果移动到结点3,那么结点3就不能被删除了

3. 如果遇到的结点不满足要求,那么cur需向前移动顺序遍历

4. 遍历完之后,原链表可能有剩余结点,我们只需要使用预先的虚拟结点newHead链接上即可

4. 新的结果链表中,我们是首先 new 了一个结点,显然该结点不属于真正结果的,我们需要返回的是 resHead->next

Leetcode:Partition List 链表快速排序划分,布布扣,bubuko.com

Leetcode:Partition List 链表快速排序划分

标签:des   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3782754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!