206. Reverse Linked List

题目描述(简单难度)

在这里插入图片描述
单链表倒置。

解法一 迭代

首先看一下原链表。
在这里插入图片描述
总共需要添加两个指针,prenext

初始化 pre 指向 NULL
在这里插入图片描述
然后就是迭代的步骤,总共四步,顺序一步都不能错。

next 指向 headnext ,防止原链表丢失

在这里插入图片描述
headnext 从原来链表脱离,指向 pre
在这里插入图片描述
pre 指向 head
在这里插入图片描述
head 指向 next
在这里插入图片描述
次迭代就完成了,如果再进行一次迭代就变成下边的样子。

在这里插入图片描述
可以看到整个过程无非是把旧链表的 head 取下来,添加的新链表头部。代码怎么写呢?

next = head.next;//保存head的next,以防取下head后丢失
head.next = pre;//将head从原链表取下,添加到新链表中
pre=head;//pre右移
head=next;//head右移

接下来就是停止条件了,我们再进行一次循环。

在这里插入图片描述
可以发现当 head 或者 next 指向 null 的时候,我们就可以停止了。此时将 pre 返回,便是逆序了的链表了。

class ListNode{
    int val;
    ListNode next;
    ListNode(int x){val=x;}
}
public class Reverse_Linked_List {
    public static ListNode reverseList(ListNode head){
        if(head==null) return null;
        ListNode pre=null;
        ListNode next;
        while(head!=null){
            next=head.next;
            head.next=pre;
            pre=head;
            head=next;
        }
        return pre;
    }
    public static void main(String args[]){
        ListNode head=new ListNode(1);
        ListNode p=head;
        p.next=new ListNode(2);
        p=p.next;
        p.next=new ListNode(3);
        p=p.next;
        p.next=new ListNode(4);
        p=p.next;
        p.next=new ListNode(5);
        ListNode ans = reverseList(head);
        while(ans!=null){
            System.out.println(ans.val);
            ans=ans.next;
        }
    }
}
解法二递归
  • 首先假设我们实现了将单链表逆序的函数,ListNode reverseListRecursion(ListNode head),传入链表头,返回逆序后的链表头。
  • 接着我们确定如何把问题一步一步的化小,我们可以这样想。

head 结点拿出来,剩下的部分我们调用函数 reverseListRecursion ,这样剩下的部分就逆序了,接着我们把 head结点放到新链表的尾部就可以了。这就是整个递归的思想了。
在这里插入图片描述

  • head 结点拿出来
    在这里插入图片描述
  • 剩余部分调用逆序函数 reverseListRecursion ,并得到了 newhead
    在这里插入图片描述
  • 将 2 指向 1 ,1 指向 null,将 newhead 返回即可。
    在这里插入图片描述
  • 找到递归出口

当然就是如果结点的个数是一个,那么逆序的话还是它本身,直接 return 就够了。怎么判断结点个数是不是一个呢?它的 next 等于 null 就说明是一个了。但如果传进来的本身就是 null,那么直接找它的 next 会报错,所以先判断传进来的是不是 null ,如果是,也是直接返回就可以了。

public ListNode reverseList(ListNode head) {
    ListNode newHead;
    if (head == null || head.next == null) {
        return head;
    }
    newHead = reverseList(head.next); // head.next 作为剩余部分的头指针
    // head.next 代表新链表的尾,将它的 next 置为 head,就是将 head 加到末尾了。
    head.next.next = head;
    head.next = null;
    return newHead;
}
python迭代
# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def reverseList(self, head):
        prev=None
        while head:
            curr=head
            head=head.next
            curr.next=prev
            prev=curr
            
        return prev
总结

关于链表的题,没有什么技巧性,还是需要多多练习。

参考文献
  • https://zhuanlan.zhihu.com/p/99243026
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安替-AnTi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值