题目:给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
思路:要考虑四个方面:
1. 每一个结点的指向都需要改变,所以要遍历整个链表,则循环条件: cur != null
2. 因为需要指向前一个结点,所以需要引用 prev 和引用 next
3. 考虑特殊情况(第一个结点和最后一个结点)和普遍情况(中间结点)。
4. 在本题中要注意返回值问题,应该返回头结点,但此时链表已经反转了,头结点不再是head。当遍历完后,cur引用已经指向null,所以应该返回他的前一个元素的引用prev。
用图来解释:
(上图中的引用的更新操作应该为:prev = cur)
这里的特殊情况和普通情况一样,所以不需要做特殊处理。应该注意的是:最后 cur 指向 null ,而 prev 指向最后一个结点,所以应该返回 prev。
代码:
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode prev = null;
while (cur != null){
ListNode next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return prev;
}