在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;
}
 

 

另外,反转链表也可以用递归实现。

posted @ 2015-07-28 17:31  大熊猫同学  阅读(1253)  评论(0编辑  收藏  举报