题目描述
- 输入一个链表,反转链表后,输出新链表的表头。
分析:
先随便表画一个链表:
这个是反转后的链表,也是我们想要的:
-
由于链表查找元素只能从头节点开始,我们可以想到,挨个挨个的将元素的指针指向前一个元素
-
如果链表的长度趋于无穷大,每一次反转,将会是O(n)的复杂度,所以的总的复杂度是O(n^2).
-
这种方法时间复杂度太高!看下面的解法
解法详解:
通过循环来解决问题:
- (1)先定义三个指针:leftPointer、midPointer、rightPointer分别指向第一、第二、第三个节点;
- (2)让leftPointer指向空(是反转链表的尾节点):
- (3)midPointer指向leftPointer:
- (4)将三个指针同时向后移一位:
- (5)midPointer指向leftPointer(和第3步一样):
- (6)将三个指针同时向后移一位(和第4步一样):
- (7)midPointer指向leftPointer(和第3步、第5步一样):
- (8)反转链表完成,这时midPointer指针指向的就是反转链表的表头了;
边界条件:
- (1)一般的情况就是上面的步骤
- (2)头节点为None,则直接返回None
- (3)头节点指向None,反转后还是这样子,则直接返回头节点
详细代码(Python):
# class ListNode:
# def __init__(self, x): # 定义链表结构
# self.val = x
# self.next = None
class Solution:
# 返回ListNode
def ReverseList(self, pHead): # pHead是初始链表的头节点
if pHead == None: # 若头节点为空,则直接返回None,(边界2)
return None
if pHead.next == None: # 若头节点指向空,则直接返回头节点(边界3)
return pHead
# 定义三个指针leftPointer、midPointer、rightPointer
leftPointer = pHead # leftPointer指向头节点 (步骤1)
midPointer = pHead.next # midPointer指向头节点的下一个节点(步骤1)
rightPointer = midPointer.next # rightPointer指向下下一个节点(步骤1)
leftPointer.next = None # 先令leftPointer,即头节点,指向空(步骤2)
while rightPointer != None: # 若指针rightPointer指向不为空,则一直遍历下去
midPointer.next = leftPointer # midPointer指向前一个节点(步骤3、5)
leftPointer = midPointer # leftPointer指针像后移动一位,到midPointer(步骤4、6)
midPointer = rightPointer # midPointer指针像后移动一位,到rightPointer(步骤4、6)
rightPointer = rightPointer.next # rightPointer指针同样向后移动一位(步骤4、6)
# 循环完成后,rightPointer是指向None的,这时到达步骤6,如图很明显还没完
midPointer.next = leftPointer # 将midPointer的next指向前一个节点,(步骤7)
return midPointer # midPointer就是新的链表的表头了