在O(n) 时间复杂度,O(1)空间复杂度内反转单链表
假设有原始链表:1->2->3
对原始链表反转,生成的反转链表是:3->2->1
反转链表的思路是:在链表的**表头**不停地插入“原始链表”中的元素,从而生成反转链表。
在表头插入元素1,生成的反转链表是:1
在**表头**插入元素2,生成的反转链表是:2->1
在表头插入元素3,生成的反转链表是:3->2->1
反转单链表的代码如下:
public ListNode reverseList(ListNode head) {
//反转链表可视为:不断地在头结点插入结点,(反转链表:经过reverse后生成的链表)
//初始时,没有结点,相当于反转链表为空 & 待插入的第一个结点是头结点
ListNode reversedLinkHead = null;//reversedLinkHead 始终指向反转链表的头结点
ListNode insertNode = head;//当前待插入的结点
while(insertNode!=null){
//记录下当前待插入结点的下一个结点,防止原始链表中断
ListNode next = insertNode.next;
//插入到反转链表的头结点
insertNode.next = reversedLinkHead;
//插入了一个新结点,更新"反转链表"的头结点
reversedLinkHead = insertNode;
//移动到下一个待插入的结点
insertNode = next;
}
return reversedLinkHead;
}
另外,反转链表也可以用递归实现。