您的位置:首页 > 其它

链表划分

2017-03-26 16:27 344 查看
1、问题描述

      给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对顺序。给定链表 1->4->3->2->5->2->null,并且 x=3,返回 1->2->2->4->3->5->null

2、实现思路

     创建两个链表,leftDummy和rightDummy分别代表小于和大于等于val的链表,head依次后移,分别将小于和大于等于val的依次放入leftDummy和rightDummy,不需要排序,最后将两个链表合起来,leftDummy的最后一个节点指向rightDummy的第二个结点,rightDummy最后指向NULL.

3、代码

/**

 * 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 NULL;

        ListNode *leftDummy = new ListNode(0);

        ListNode *rightDummy = new ListNode(0);

        ListNode *left = leftDummy;

        ListNode *right = rightDummy;

        while (head !=NULL) 

        {

            if (head->val < x) 

               {

                left->next=head;

                left = head;

               } 

            else

               {

                right->next = head;

                right = head;

               }

            head = head->next;

        }

        right->next =NULL;

        left->next = rightDummy->next;

        return leftDummy->next;

    }

};

4、感想

      本题并不需要排序,只需将小于和大于等于分在左右即可,注意建立leftDummy和rightDummy头节点都为0, 分好的两个链表left最后一个结点指向 rightDummy->next,right->next =NULL。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: