问题描述
先上代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre = null, next = null, cur = head;
while(cur != null) {
//取出当前节点的下一个节点
next = cur.next;
//令这个节点的next为前一个节点
cur.next = pre;
//pre游标向后移动
pre = cur;
//cur游标向后移动
cur = next;
}
return pre;
}
}
解析:
重点在于while循环的四行,这里设置了三个游标,每次循环都把当前游标的next指针反转,当cur移到链表末端时,即完成反转。
初始状态如下
第一次循环,执行完前两行之后:
执行完第一遍循环的状态:
以此类推,完成第二遍循环时的状态:
时间复杂度:
这个算法只需要扫描一遍即可完成链表反转,时间复杂度是O(n)。