单链表 反转

1,132 阅读4分钟

只有单链表才需要反转

为什么?因为双向链表,可以顺着,或者倒着,找到其他节点。

我们之所以要反转单链表,就是要为了反方向遍历节点。

目标

原始

反转之后


方法一:迭代

假设存在链表 1 → 2 → 3 → null,我们想要把它改成 null ← 1 ← 2 ← 3。

解决方法

思想

这里我们只讲一种解决方法。就是1.原地反转2.迭代。

原地反转,指的是不需要额外的内存空间。

迭代,指的是不是递归处理数据,而是循环处理数据。


代码

public ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    
    while (curr != null) {
        ListNode nextTemp = curr.next; //n引用指向当前引用的下一个节点
        curr.next = prev; //当前引用.next节点,指向p引用
        prev = curr; //p引用指向当前引用
        curr = nextTemp; //当前引用,指向n引用
    }
    
    return prev; //最终,p引用,是指向最后一个节点。因为已经反转,所以最后一个节点变成了第一个节点,也就是头节点。
}

解决思路

1.在遍历列表时,将当前节点的 next 指针改为指向前一个元素。

2.由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。

3.在更改引用之前,还需要另一个指针来存储下一个节点。

4.不要忘记在最后返回新的头引用!

两个核心问题

也就是两个指针的问题。弄清楚这个,就弄清楚了算法。不然,指来指去,根本搞不清楚。理解的,永远都是错的。

首先,根本不存在指针,因为java里没有指针,只有引用。

具体来说,就是变量引用指向对象本身,即变量引用——》对象本身。

这里的本质问题,1.就是变量可以有多个,这些多个变量,可能都指向同一个对象本身。这是第一点。2.第二点,变量可以随时指向其他的对象。指向其他的对象之后,之前的对象还在那里,还存在,并没有任何改变。也就是说,之前的对象,还可以继续被其他的变量去指向它。

以上,就是算法的本质。

至于,具体画图的时候,只是为了方便理解,可视化。实际上,除了链表里的节点是真正的对象本身,那些临时变量,都只是引用,这些变量引用指向的就是链表节点。

两个指针

第一个指针

示意图

这里的箭头,指的是1.next节点,指向2节点。//这里只是示意图,不是本质。

具体来说,本质其实是这样的:
1.1引用指向1对象本身
2.2引用指向2对象本身
3.1.next引用指向2对象本身 //也就是说,1.next引用和2引用,实际上,指的是同一个对象本身

看到没有?总共只有2个实际的对象本身。总共有3个变量引用。

但是,实际画图的时候,我们并没有把对象本身画出来,因为那样太麻烦了,图都看不清楚了。所以,
1.单链表里的节点,既表示引用,又表示对象本身。 //1 2节点
2.其他的临时节点,只表示引用,他们指向链表节点。//p n c 节点.next,都是引用。引用,都用箭头表示,即引用指向对象本身。


第二个指针

示意图

这里的4个箭头,表示4个引用指向3个节点,2个链表节点,一个null节点。null是null对象本身。

其中,1.next变量和n变量,指向同一个节点2。

完整示意图

这里只讲循环里的两次循环,其他的,以此类推。

1.第一轮

2.第二轮
省略


注意

1.每一步,只画改动的地方,即代码执行之后,指针指向变动的地方。其他地方,没改,就不画。这样更清晰,知道每一步到底干了啥。
2.初始和结束。


总结

根据示意图,可以看到,我们的目标,就是:
1.第一轮 //让1指向null
2.第二轮 //让2指向1
...

最终,实现反转。1.尾节点1指向null 2.中间节点,指向全部反过来了 3.头结点就是以前的尾节点。

基于目标,再去看示意图,和代码实现,就更清楚了。每一轮,实际上只修改了一个指针指向。即:
1.第一轮 //让1指向null
2.第二轮 //让2指向1
...

最终,遍历所有节点之后,就实现了所有节点的反转。

以上示意图,基于前面的代码里的四步操作。即:

    ListNode nextTemp = curr.next;
    curr.next = prev;
    prev = curr;
    curr = nextTemp;

参考

www.javazhiyin.com/32787.html

leetcode-cn.com/problems/re…