力扣 206题 反转链表

64 阅读2分钟

206. 反转链表

已解答

简单

相关标签

相关企业

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 

示例 1:

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

我的思路很无脑,就是通过循环来找到链表中的最后一个数,然后将它加入到另一个链表中,然后将原链表中的最后一个数删除,这个思路存在几个问题。1。每次对新链表进行添加元素时,都需要判断这个链表是否为空,可能有的情况只需要在循环中判断,可能有点情况需要在循环外判断,但是因为需要通过所有的case,所以在循环内外都需要判断一次。2.这个思路在循环时,会存在删除到只剩下1个元素的链表,这时head.next.next这个操作就会报错,所以需要跳出循环,重新来加入这最后一个元素。

代码如下:

577e48e5019b70556534d9ee58b1011.png 43174589e708d46bafeb118a9de2563.png

这个思路蛮好理解,就是代码可能需要考虑一下特殊情况。

接下来就是答案的解法:

双指针解法: 首先定义一个prev指向null的指针,然后定义一个cur指向head的指针,然后让cur.next指向prev,并且将prve和cur都后移一位。

代码如下:

image.png

这个地方非常容易出错的点就是,你在操作完了之后,他的那个头节点不再是head,而是prve,如果你返回head,则只能得到最末尾的一个值,所以要返回prve;

下一个就是用递归来实现上述思路:

代码如下:

image.png

两种方法的思路是一样的,只不过递归需要想明白逻辑,有时候递归看起来很好理解,每一次看递归代码的时候都会觉得这一步非常精妙,但是偏偏自己写的时候就写不出来这种感觉。