反转链表——递归和迭代双解法

111 阅读1分钟

这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

前言

大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文讲述反转链表的一些解法。

题目

image.png

解法

解法一:迭代

思路:

  1. 使用三个指针依次指向null,head和head.next,分别表示为l、m、r
  2. 循环将三个指针依次向后移动。在每次移动之前,把m的next赋值为l。
  3. 当r为null时循环结束。此时m指向最后一个节点。只需要把m的next赋值为l即可。 图示如下:

初始状态: image.png

循环移动:

image.png

image.png

image.png

image.png

当R指向为null时退出循环,此时M还未完成转换,还需要把m的next赋值为l即可。

具体代码如下:

public ListNode reverseList(ListNode head){
    if(head==null || head.next==null){
        return head;
    }
    ListNode beg=null;
    ListNode mid=head;
    ListNode end=head.next;
    while(end!=null){
        //反向指针
        mid.next=beg;
        //循环移动
        beg=mid;
        mid=end;
        end=end.next;
    }
    mid.next=beg;
    return mid;
}

解法二:递归

主要思想:一层一层递归,将自己的下一个的下一个引用指向自己,也就相当于反转了链表。

递归表达式:

head.next.next = head;
head.next=null;

递归结束条件:

if(head==null || head.next==null){
    return head;
}

图示如下:

image.png

image.png

image.png

image.png

image.png

具体代码如下:

public ListNode reverseList(ListNode head){
    //结束条件
    if(head==null || head.next==null){
        return head;
    }
    ListNode new_head = reverseList(head.next);
    //反向指针
    head.next.next = head;
    head.next=null;
    return new_head;
}

小结

以上就是关于反转链表的两种简单解法,希望对读者有所帮助,觉好留赞哦。