反转链表
题目
力扣206
题目:反转一个单链表。
示例:
- 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
- 输入:1->2 ->NULL 输出:2->1->NULL
- 输入:[] 输出:[]
思路
快慢指针(双指针)的灵活使用
- 这个题非常考究大家对双指针的运用,此题大家需要看懂一个地方,那就是翻转以后,头结点head从第一个节点到了最后一个节点。其他元素没有变化,指针的方向发生了反转。
- 此时大家需要思考,双指针怎么滑动,谁在前,谁在后。节点的指针怎么反转比较合理。
- 我们需要只要的是,链表反转以后,相对于原来的链表,本来是当前节点指向下一个节点,反转以后成为下一个节点指向前一个结点。
- 考虑到双指针,我们需要首先定义一个零时节点变量来保存当前节点的下一个节点,ListNode temp = null;
- 同时我们需要用一个pre来表示前一个结点, ListNode pre = null;
- 当前结点则用 ListNode cur = head;
核心思路
temp = cur.next; //保存当前节点
cur.next = pre; //让当前节点指向前一个结点(指针以发生转向)
pre = cur;//前一个结点的指针移到当前结点(慢指针)
cur = temp;//当前结点的指针指向下一个结点(快指针)
代码
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null) {
return head;
}
ListNode pre = null;
ListNode temp = null;
ListNode cur = head;
while(cur!=null) {
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}