已解答
简单
相关标签
相关企业
给你单链表的头节点 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这个操作就会报错,所以需要跳出循环,重新来加入这最后一个元素。
代码如下:
这个思路蛮好理解,就是代码可能需要考虑一下特殊情况。
接下来就是答案的解法:
双指针解法: 首先定义一个prev指向null的指针,然后定义一个cur指向head的指针,然后让cur.next指向prev,并且将prve和cur都后移一位。
代码如下:
这个地方非常容易出错的点就是,你在操作完了之后,他的那个头节点不再是head,而是prve,如果你返回head,则只能得到最末尾的一个值,所以要返回prve;
下一个就是用递归来实现上述思路:
代码如下:
两种方法的思路是一样的,只不过递归需要想明白逻辑,有时候递归看起来很好理解,每一次看递归代码的时候都会觉得这一步非常精妙,但是偏偏自己写的时候就写不出来这种感觉。