链表转置算法

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就是转置后的链表了

相关推荐
颜酱9 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_7369191010 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi98783810 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
DuHz10 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
Polaris北极星少女10 小时前
TRSV优化2
算法
代码游侠11 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_7634724611 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
abluckyboy12 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
园小异12 小时前
2026年技术面试完全指南:从算法到系统设计的实战突破
算法·面试·职场和发展
m0_7066532312 小时前
分布式系统安全通信
开发语言·c++·算法