链表-143.重排链表-力扣(LeetCode)

一、题目解析

1、不能单纯改变节点内部的值,要改变节点的指针

2、节点个数为[1,5*10^4]

二、算法原理

解法:模拟

对于上面的重排,我们可以将其拆解为两个链表合并,后面一个链表需要逆置,而分割的位置正好处于原链表的中间节点,由此我们可以模拟这个过程来重拍链表

1、找到链表的中间节点

快慢指针法

2、把后面的部分逆置

三指针头插法
只需按顺序链接即可,newhead->next = slow,slow->next = tail,tail = slow

3、合并两个链表

以一个哨兵为头节点,依次尾插即可,最后delete哨兵位头节点即可

画图可以解决指针链接问题,链表问题建议多画图

三、代码示例

cpp 复制代码
class Solution {
public:
    void reorderList(ListNode* head)
    {
        ListNode* cur1 = head,*cur2 = head;
        //找中间
        while(cur2 && cur2->next)
        {
            cur1 = cur1->next;
            cur2 = cur2->next->next;
        }
        //逆序后面(头插三指针)
        ListNode* newhead2 = new ListNode();
        newhead2->next = cur1;
        ListNode* cnext = cur1->next;
        cur1->next = nullptr;
        while(cnext)
        {
            ListNode* nnext = cnext->next;
            newhead2->next = cnext;
            cnext->next = cur1;
            cur1 = cnext;
            cnext = nnext;
        }
        //合并
        ListNode* newhead1 = new ListNode();
        ListNode* tail = newhead1;
        while(cur1)
        {
            tail->next = head;
            tail = head;
            if(head->next == nullptr) break;
            head = head->next;
            tail->next = cur1;
            tail = cur1;
            cur1=cur1->next;
        }
        //释放哨兵位头节点
        delete newhead1;
        delete newhead2;
    }
};

看到最后,如果对您有所帮助,还请点赞、收藏和关注,我们下期再见!

相关推荐
东方芷兰43 分钟前
Leetcode 刷题记录 21 —— 技巧
java·算法·leetcode·职场和发展·github·idea
爱编程的化学家5 小时前
代码随想录算法训练营第六天 - 哈希表2 || 454.四数相加II / 383.赎金信 / 15.三数之和 / 18.四数之和
数据结构·c++·算法·leetcode·双指针·哈希
木心爱编程8 小时前
C++链表实战:STL与手动实现详解
开发语言·c++·链表
papership10 小时前
【入门级-算法-6、排序算法: 插入排序】
数据结构·算法·排序算法
得意霄尽欢10 小时前
Redis之底层数据结构
数据结构·数据库·redis
I'm a winner11 小时前
第五章:Python 数据结构:列表、元组与字典(二)
数据结构·python
我是是是是是西红柿11 小时前
游戏中的展销系统使用的数据结构
数据结构·游戏
爱吃烤鸡翅的酸菜鱼11 小时前
【Redis】常用数据结构之Hash篇:从常用命令到使用场景详解
数据结构·数据库·redis·后端·缓存·哈希算法
二进制person12 小时前
数据结构--Map和Set
数据结构
我叫汪枫12 小时前
C语言深度入门系列:第十一篇 - 动态内存管理与数据结构:程序世界的高效算法大师
c语言·数据结构·算法