文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++如何划分链表

2023-06-19 12:50

关注

这篇文章主要介绍了C++如何划分链表的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++如何划分链表文章都会有所收获,下面我们一起来看看吧。

划分链表

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

这道题要求我们划分链表,把所有小于给定值的节点都移到前面,大于该值的节点顺序不变,相当于一个局部排序的问题。那么可以想到的一种解法是首先找到第一个大于或等于给定值的节点,用题目中给的例子来说就是先找到4,然后再找小于3的值,每找到一个就将其取出置于4之前即可,代码如下:

解法一

class Solution {public:    ListNode *partition(ListNode *head, int x) {        ListNode *dummy = new ListNode(-1);        dummy->next = head;        ListNode *pre = dummy, *cur = head;;        while (pre->next && pre->next->val < x) pre = pre->next;        cur = pre;        while (cur->next) {            if (cur->next->val < x) {                ListNode *tmp = cur->next;                cur->next = tmp->next;                tmp->next = pre->next;                pre->next = tmp;                pre = pre->next;            } else {                cur = cur->next;            }        }        return dummy->next;    }};

这种解法的链表变化顺序为:

1 -> 4 -> 3 -> 2 -> 5 -> 2 

1 -> 2 -> 4 -> 3 -> 5 -> 2 

1 -> 2 -> 2 -> 4 -> 3 -> 5

此题还有一种解法,就是将所有小于给定值的节点取出组成一个新的链表,此时原链表中剩余的节点的值都大于或等于给定值,只要将原链表直接接在新链表后即可,代码如下:

解法二

class Solution {public:    ListNode *partition(ListNode *head, int x) {        if (!head) return head;        ListNode *dummy = new ListNode(-1);        ListNode *newDummy = new ListNode(-1);        dummy->next = head;        ListNode *cur = dummy, *p = newDummy;        while (cur->next) {            if (cur->next->val < x) {                p->next = cur->next;                p = p->next;                cur->next = cur->next->next;                p->next = NULL;            } else {                cur = cur->next;            }        }        p->next = dummy->next;        return newDummy->next;    }};

此种解法链表变化顺序为:

Original: 1 -> 4 -> 3 -> 2 -> 5 -> 2 

New:

Original: 4 -> 3 -> 2 -> 5 -> 2 

New:   1

Original: 4 -> 3 -> 5 -> 2 

New:   1 -> 2

Original: 4 -> 3 -> 5 

New:   1 -> 2 -> 2

Original: 

New:   1 -> 2 -> 2 -> 4 -> 3 -> 5 

关于“C++如何划分链表”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++如何划分链表”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯