206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解决思路:
- 需要定义四个节点;
- 为了解决反转当前节点的时候找不到前驱节点,那我们就需要一个节点来保存当前节点的前驱节点;
- 同时定义cur表示当前反转的节点;
- curNext是下一个需要反转的节点,需要注意,cur不为空的时候才有curNext,否则就会空指针异常;
- 最最最重要的是要把反转后的新链表的头节点存起来,就是newHead;
- 反转的思路是:
- 反转节点的next指向前驱节点;
cur.next = prev;
- 前驱节点往后移;
prev = cur;
- 反转的节点往后移;
cur = curNext;
- 如果在反转的过程中cur.next == null;那么就找到新的头节点了,记得保存。
public ListNode reverseList(ListNode head) {
//定义四个节点,cur不为空的时候再定义curNext
ListNode prev = null;
ListNode cur = head;
ListNode newHead = null;
while (cur != null) {
ListNode curNext = cur.next;
//如果cur.next == null,就是新的头节点,保存下来
if (cur.next == null) {
newHead = cur;
}
cur.next = prev;//先把cur.next指向先驱
prev = cur;//先驱挪到后面一个
cur = curNext;//cur也往后挪一个
}
return newHead;
}