题目链接
反转链表
题目描述
注意点
- 链表中节点的数目范围是 [0, 5000]
解答思路
- 迭代或递归解决本题
代码
方法一:
// 迭代
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode prevNode = null;
ListNode currNode = head;
while (currNode != null) {
ListNode nextNode = currNode.next;
currNode.next = prevNode;
prevNode = currNode;
currNode = nextNode;
}
return prevNode;
}
}
方法二:
// 递归
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
关键点
- 相对于迭代,递归可能更难理解,其思路为:反转链表后的头结点是原来的尾节点,所以返回的头结点肯定是最后一次递归的节点,但是在每次递归时要得到后面的节点将其指针指向前面的节点,所以需要先递归调用反转方法,同时得到后面的节点,再根据后面的节点将指针进行反转,最后返回后面的节点