每天一道LeetCode-----将链表中满足条件的节点移动到前面

来源:互联网 发布:mysql use index 编辑:程序博客网 时间:2024/05/16 17:01

Partition List

原题链接Partition List

这里写图片描述

重组链表,将所有小于给定值x的节点移动到前面,前后两部分的原始顺序不能改变,也就是说

  • 将所有小于x的节点移动到前半部分,大于等于x的节点移动到后半部分
  • 对于所有小于x的节点,调整之后的相对顺序不能改变
  • 对于所有大于等于x的节点,调整之后的相对顺序不能改变

思路比较简单,遍历一遍链表,将所有小于x的节点组成一个新链表,将所有大于等于x的节点组成另一个新链表,最后两个链表头尾连接,解决任务:)

代码如下

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* partition(ListNode* head, int x) {        /* 作为两个链表的表头,避免表头为空以及为表头赋值的情况 */        ListNode* lessHeader = new ListNode(-1);        ListNode* moreHeader = new ListNode(-1);        /* 从表头开始 */        ListNode* lessCur = lessHeader;        ListNode* moreCur = moreHeader;        ListNode* cur = head;        while(cur)        {            /* 将当前节点连接在大于等于x的链表上 */            if(cur->val >= x)            {                moreCur->next = cur;                moreCur = cur;                cur = cur->next;                moreCur->next = nullptr;            }            /* 连接到小于x的链表上 */            else            {                lessCur->next = cur;                lessCur = cur;                cur = cur->next;                lessCur->next = nullptr;            }        }        lessCur->next = moreHeader->next;        head = lessHeader->next;        delete lessHeader;        delete moreHeader;        return head;    }};

根据题意,本题要求将链表分成两部分,一部分是大于x的节点,另一部分是大于等于x的节点,所以只需要分别构成一个链表最后连接在一起即可。类似的题目都可以利用这种方法求解

阅读全文
0 0
原创粉丝点击