题目分析:
给定一个链表,题目要求返回反转链表后的头节点
。例如1 -> 2 -> 3 -> 4 -> 5
,反转后的结果5 -> 4 -> 3 -> 2 -> 1
。
所使用到的指针:pre : 前一个结点
、cur : 当前结点
、after : cur后面一个结点
AC代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode reverseList(ListNode head) {
// 就是非递归的链表反转模板
ListNode pre = null, cur = head;
while(cur != null){
ListNode after = cur.next;
cur.next = pre;
pre = cur;
cur = after;
}
return pre;
}
}
解题思路:
此时的pre
为null
。
特别注意点after
必须要在循环内部才能进行赋值
,为的就是后面的反转操作都相同
进而使用while
。
为什么可以使用到递归求解呢?
因为反转链表无非就是将当前结点的下一个结点指向自己
,然后自己的next指针指向null
。所以都是一系列的重复操作
,所以可以使用递归
。
AC代码
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode cur = reverseList(head.next);
head.next.next = head;
head.next = null;
return cur;
}
}
当递归到最后的一个结点返回
如下图所示
当前head
为 4所在的结点
,head.next = null
继续返回
,当前head 为 3 所在的结点
有的同学可能会问为什么最后返回的是正确的结果呢(为什么是5
所在的结点呢)?
你有没有发现我们一直返回
的是cur
,所以就是到倒数第二个结点
时(也就是递归返回时的cur),那么也就是5所在的结点
。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_56727438/article/details/121086023
内容来源于网络,如有侵权,请联系作者删除!