反转单链表:递归和迭代

反转单链表

LeetCode92
在这里插入图片描述
单链表的结构为:

// 单链表节点的结构
public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

1. 迭代实现法
这里用一张人家画好的图,思想是定义三个节点pre、nxt、cur,cur节点表示当前的节点,nxt记录院链表中cur的下一个节点,pre初始化为null,首先让头节点指向pre,cur和pre都向后移动一位,接着让cur一直指向pre,重复此操作,当cur为空时链表就被成功反转了,此时返回链表的头节点pre。在这里插入图片描述
代码如下:

public LinkNode reverse(LinkNode head){
    LinkNode pre = null;
    LinkNode cur = head;
    LinkNode nxt = null;
    while(cur != null){
         nxt = head.next;
         cur.next = pre;
         pre = cur;
         cur = nxt;  
    }
    return pre;
}

2. 递归实现法
先上代码:

ListNode reverse(ListNode head) {
    if (head.next == null) return head;
    ListNode last = reverse(head.next);
    head.next.next = head;
    head.next = null;
    return last;
}

对于递归法,最重要的是明确函数的定义,这个函数的定义是:**给你链表的头指针,将整个链表反转并且返回链表的头指针。**因此就有了这行代码:

ListNode last = reverse(head.next);

本来链表是这样的:
在这里插入图片描述
执行了这行代码后链表就变成了这样,因为我们是对以head.next为头节点进行反转:
在这里插入图片描述
接下来执行下面这行代码,链表就变成了这样:

head.next.next = next

在这里插入图片描述
head.next是2这个节点,head.next.next=head就是把2这个节点的下一个节点变成了1,成功干掉了2后面的null。最后记得令head指向null,链表就被反转了。返回的头节点用last接收。

head.next = null;
return last;

递归法总结:脑子里牢记函数的定义,不要管它具体怎么实现!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值