链表转置算法

Question

给出链表node,如何转置并输出
例如链表node:
node(0)->node(1)->node(2)->node(3)->node(4)
输出结果:
node(4)->node(3)->node(2)->node(1)->node(0)

Answer

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

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

那么梳理一下——
遍历第一次:

node(0).next = head
head = node(0);

遍历第二次:

node(1).next = head
head = node(1);

……
遍历最后一次:

node(4).next = head
head = node(4);

看上去很简单,整个遍历完毕后,就是
node(4)->node(3)->node(2)->node(1)->node(0)结果,但是运行的时候发现不正确,原因很简单
我们在遍历链表的时候肯定是这么来的

while(n != null) {
	//...
	n = n.next
}

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

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

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

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

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

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_lea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值