链表转置算法

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

相关推荐
INGNIGHT16 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_8390805416 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山17 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds17 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a1879272183117 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx17 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_3077791318 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐19 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归
charliejohn19 小时前
计算机考研 408 数据结构 堆的插入与删除 堆排序
算法
老鱼说AI19 小时前
从点积到希尔伯特空间:向量内积的几何本质与大模型相似度度量
人工智能·深度学习·线性代数·算法·机器学习·数学建模