这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文讲述反转链表的一些解法。
题目
解法
解法一:迭代
思路:
- 使用三个指针依次指向null,head和head.next,分别表示为l、m、r
- 循环将三个指针依次向后移动。在每次移动之前,把m的next赋值为l。
- 当r为null时循环结束。此时m指向最后一个节点。只需要把m的next赋值为l即可。 图示如下:
初始状态:
循环移动:
当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;
}
图示如下:
具体代码如下:
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;
}
小结
以上就是关于反转链表的两种简单解法,希望对读者有所帮助,觉好留赞哦。