力扣难题:重排链表

首先通过快慢指针找到中间节点,然后将中间节点之后和之前的部分分为两个链表,然后翻转后面的链表,注意方法,然后将两个链表交替链接。

复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
        if(!head||!head->next)
            return;
        ListNode *fast=head,*low=head;
        ListNode *pre=nullptr,*cur=nullptr,*next=nullptr;
        while(fast->next!=nullptr){
            fast=fast->next;
            if(fast->next)
                fast=fast->next;//如果不是最后一个就走两步
            low=low->next;
        }
        //当快指针到头,慢指针位置就是链表中间位置,cur指向后半段第一个
        cur=low->next;
        //不断开前半段的指针,会报错内存异常
        low->next=nullptr;
        //翻转从cur到结尾的链表部分
        while(cur){
            next=cur->next;
            cur->next=pre;
            pre=cur;
            cur=next;
        }
        //此时pre指向后半段翻转过的链表头,head是前半段的链表头
        //将pre的链表插入到head的链表间隔中
        cur=head;
        while(cur&&pre){
            ListNode *temp=pre->next;//保存pre的下一个
            pre->next=cur->next;
            cur->next=pre;
            cur=pre->next;
            pre=temp;
        }
    }
};
相关推荐
子夜江寒2 分钟前
YOLO目标检测算法简介
算法·yolo·目标检测
逆境不可逃12 分钟前
LeetCode 热题 100 之 279. 完全平方数 322. 零钱兑换 139. 单词拆分 300. 最长递增子序列
java·算法·leetcode·职场和发展
美式请加冰16 分钟前
位运算符的介绍和使用
数据结构·算法
tankeven18 分钟前
HJ127 小红的双生串
c++·算法
Fcy64820 分钟前
与链表有关的算法题
数据结构·算法·链表
KerwinChou_CN21 分钟前
LangGraph 快速入门
服务器·网络·算法
安之若素.re39 分钟前
918. 环形子数组的最大和
算法
阿阿阿阿里郎42 分钟前
ROS2快速入门--C++基础
开发语言·c++·算法
free-elcmacom44 分钟前
C++<x>new和delete
开发语言·c++·算法
lxh01131 小时前
计算右侧小于当前元素的个数 题解
javascript·数据结构·算法