算法类型描述以及举例06_反转链表( In-place Reversal of a LinkedList)

算法类型描述以及举例06_反转链表( In-place Reversal of a LinkedList)

原帖子链接:https://zhuanlan.zhihu.com/p/104983442

1、简答描述

一种能够改变链表顺序并能重复使用遍历到的节点的算法。将每次遍历完原来链表的结果,的下一个指针位置指向一个结果链表。

2、优势

重复使用原链表中已有的节点,降低空间复杂度

3、使用场景

如果你被问到需要去翻转链表,要求不能使用额外空间的时候

4、例子

/**
 * Definition for singly-linked list.
 */
public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}


/**
 * leetcode_206_反转链表 链表反转
 *
 * 核心思路:将每次遍历完原来链表的结果,的下一个指针位置指向一个 结果链表!
 *
 *
 * 具体做法:
 * 1、一个pre,保存反转后的链表。(结果链表)
 *   一个cur,用于遍历链表
 *
 * 2、每次cur遍历,将cur的next指向pre。 pre前移,指向cur即可
 * (注意:需要保存cur.next 原cur的下一个节点的地址,用于遍历原链表)
 * @param head
 * @return
 */
public ListNode reverseList(ListNode head) {
    ListNode pre = null;//定义pre指向空,保存翻转后的链表
    ListNode cur = head;//利用cur去遍历原来链表。

    while (cur != null) {
        //将当前节点的next 保存到中间变量(很重要,否则下一步当前节点的next被pre覆盖,原来的next就丢失了。这样就无法遍历了)
        ListNode temp = cur.next;
        //将当前节点cur的下一个节点指向 pre。
        cur.next = pre;
        //将pre前移,指向当前节点cur
        pre = cur;
        //cur接着遍历! 让他等于之前保存的cur的next节点
        cur = temp;
    }
    return pre;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值