单链表反转
方法一:迭代
假设链表为
null → 1 → 2 → 3 → 4 → 5
反转后:
null ← 1 ← 2 ← 3 ← 4 ← 5
在遍历链表时,将当前节点的 \textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
class Solution {
public ListNode reverseList(ListNode head) {
ListNode preNode = null;
ListNode curNode = head;
while(curNode != null){
ListNode next = curNode.next;
curNode.next = preNode;
preNode = curNode;
curNode = next;
}
return preNode;
}
}
复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。