链表转置算法

Question

给出链表node,如何转置并输出

例如链表node:

node(0)->node(1)->node(2)->node(3)->node(4)

输出结果:

node(4)->node(3)->node(2)->node(1)->node(0)

Answer

**思考步骤:**遍历一次就要形成一个新的转置链表,首先想到的就是链表头插法,头插法逻辑:

java 复制代码
public void addFirst(ListNode newNode,ListNode head) {
    //链表头插法
    newNode.next = head;
    head = newNode;
}

那么梳理一下------

遍历第一次:

java 复制代码
node(0).next = head
head = node(0);

遍历第二次:

java 复制代码
node(1).next = head
head = node(1);

......

遍历最后一次:

java 复制代码
node(4).next = head
head = node(4);

看上去很简单,整个遍历完毕后,就是

node(4)->node(3)->node(2)->node(1)->node(0)结果,但是运行的时候发现不正确,原因很简单 ,

我们在遍历链表的时候肯定是这么来的

java 复制代码
while(n != null) {
	//...
	n = n.next
}

但是我们在上文遍历的情况下,设置了node(x).next = head,这个会导致链表的next指针被修改了,那么n.next肯定指向不了真正的下一个对象

java 复制代码
//有问题的代码
ListNode pre = null;
while (n != null) {
    //头插法
    n.next = pre;
    pre = n;
    n = n.next;   //这里实际上被上文的n.next = pre;覆盖了,导致循环不了!!!
}

所以我们需要定义一个临时变量,保存链表的next内容

java 复制代码
//正确代码
ListNode pre = null;
while (n != null) {
    ListNode t = n.next;   //临时保存next对象

    //头插法
    n.next = pre;
    pre = n;

    n = t;   //使用上文临时保存的next对象,保证能够正常迭代
}

最后输出的pre就是转置后的链表了

相关推荐
启观川13 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸13 小时前
排序算法介绍
python·算法·排序算法
动词ing15 小时前
【题目练习】算法 组合总和||
算法
longlongzihan15 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源15 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic10115 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi01115 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯16 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水16 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB16 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法