LintCode 96. 链表划分

Posted zslhg903

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LintCode 96. 链表划分相关的知识,希望对你有一定的参考价值。

给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。

你应该保留两部分内链表节点原有的相对顺序。

样例

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

返回 1->2->2->4->3->5->null

解:很简单,主要逻辑在while循环部分。

/**
 * 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
    
    //用两个链表表示,分别存储小于x的节点和大于等于x的节点
      ListNode* smHead=NULL,*smTail=NULL,*bgHead=NULL,*bgTail=NULL;
     
      ListNode* cur=NULL;
      //逻辑主体
      while(head)
      {
          cur=head;
          head=head->next;    //注意head更新的位置,不能放在循环后面更新,因为insertNode()会改变cur->next
          if(cur->val<x)
          {
              insertNode(smHead,smTail,cur); //将node节点插入到小于x的链表的尾部
          }
          else
          {
              insertNode(bgHead,bgTail,cur); //将node节点插入到大于等于x的链表的尾部
          }
      }
      //判断返回的链表
      if(smHead==NULL)
      {
          return bgHead;
      }
      else if(bgHead==NULL)
      {
          return smHead;
      }
      else//拼接两链表
      {
          smTail->next=bgHead;
          return smHead;
      }
    }
    
    //将node节点插入到链表尾部
    void insertNode(ListNode* &head,ListNode* &tail,ListNode* node)
    {
        node->next=NULL;
        if(head==NULL)
        {
            head=node;
            tail=head;
            return;
        }
        tail->next=node;
        tail=tail->next;
    }
    
};

 

以上是关于LintCode 96. 链表划分的主要内容,如果未能解决你的问题,请参考以下文章

LintCode之两两交换链表中的节点

LintCode之链表倒数第n个节点

lintcode166 链表倒数第n个节点

LintCode之在O时间复杂度删除链表

LintCode Python 简单级题目 35.翻转链表

LintCode Python 简单级题目 链表求和