链表-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;
    }
};

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

相关推荐
nsjqj15 分钟前
数据结构:Map 和 Set (二)
java·开发语言·数据结构
YouEmbedded3 小时前
解码数据结构内核链表
数据结构·链表·内核链表
Han.miracle3 小时前
数据结构——二叉树学习
数据结构·学习
hello_lain3 小时前
9.1 简单排序(冒泡、插入)(排序(上))
c语言·数据结构·算法·排序算法
炬火初现4 小时前
Hot100——普通数组
算法·leetcode·职场和发展
啊我不会诶4 小时前
【数据结构】字典树
数据结构·算法
信奥卷王4 小时前
[GESP202403 五级] 成绩排序
数据结构·算法
小欣加油4 小时前
leetcode 494 目标和
c++·算法·leetcode·职场和发展·深度优先
Jiezcode6 小时前
LeetCode 55.跳跃游戏
c++·算法·leetcode·游戏