zoukankan      html  css  js  c++  java
  • lintcode-96-链表划分

    96-链表划分

    给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。
    你应该保留两部分内链表节点原有的相对顺序。

    样例

    给定链表 1->4->3->2->5->2->null,并且 x=3
    返回 1->2->2->4->3->5->null

    标签

    链表 两根指针

    思路

    遍历一次链表,使用常数级的额外空间,具体做法是:
    使用两个指针lessNext,moreNext重新规划链表。使比 x 小的节点和比 x 大的节点重新组成两个新的链表,lessHead,moreHead是这两个新链表的头结点指针,然后,合并这两个链表即可。

    code

    /**
     * Definition of ListNode
     * class ListNode {
     * public:
     *     int val;
     *     ListNode *next;
     *     ListNode(int val) {
     *         this->val = val;
     *         this->next = NULL;
     *     }
     * }
     */
    class Solution {
    public:
        /**
         * @param head: The first node of linked list.
         * @param x: an integer
         * @return: a ListNode 
         */
        ListNode *partition(ListNode *head, int x) {
            // write your code here
            if(head == NULL) {
                return head;
            }
            ListNode *lessHead = NULL, *lessNext = NULL;
            ListNode *moreHead = NULL, *moreNext = NULL;
            ListNode *current = head;
            bool isLessHead = true, isMoreHead = true;
    
            while(current != NULL) {
                if(current->val < x) {
                    if(isLessHead){
                        lessHead = lessNext = current;
                        isLessHead = false;
                    }
                    else {
                        lessNext->next = current;
                        lessNext = lessNext->next;
                    }
                }
                else {
                    if(isMoreHead){
                        moreHead = moreNext = current;
                        isMoreHead = false;
                    }
                    else {
                        moreNext->next = current;
                        moreNext = moreNext->next;
                    }
                }
                current = current->next;
            }
    
            if(lessNext != NULL && moreNext != NULL) {
                lessNext->next = moreHead;
                moreNext->next = NULL;
                return lessHead;
            }
            else if(lessNext == NULL){
                moreNext->next = NULL;
                return moreHead;
            }
            else if(moreNext == NULL) {
                lessNext->next = NULL;
                return lessHead;
            }
        }
    };
    
  • 相关阅读:
    重构技巧 引入Null对象
    python yield
    todo
    Python 函数式编程学习
    Python 修饰器
    socket
    Exception、RuntimeException
    设计模式
    线程池
    VMware异常关闭后再次启动提示“以独占方式锁定此配置文件失败”!!!
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7154023.html
Copyright © 2011-2022 走看看