本次主要思考反转链表的算法题。
我个人用的是递归的思路,当然还有其他的双指针之类的方法。
下面是我的题解:
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode last = reverseList(head.next);
head.next.next = head;
head.next = null;
return last;
}
}
下面是我的思路:
if(head == null || head.next == null) return head;
意思是如果链表只有一个节点或者为空的时候反转也是它自己,直接返回即可。
reverseList 函数的定义是这样的:
确定一个头节点head,将这个链表反转并且返回反转之后的头节点,
可以看到 我们在这一步进行递归: ListNode Node = reverseList(head.next);
reverseList(head.next)执行完成之后得出以下结果:
并且使用last接收反转之后的头节点
然后在进行下面的代码
head.next.next = head;
这一步是让2原本指向null的指针现在指向1了,把整个链表连接起来
head.next=null;
当链表递归反转之后,新的头结点是last,而之前的head变成了最后一个节点,要记得链表末尾的尾指针要指向 null
这一步完成后就让整个链表成功反转过来了。