题目描述
输入一个链表,反转链表后,输出新链表的表头。
由于输入的为链表输出的也为列表,因此可从调整它自身内部的指针指向下手。
示例:
- 初始链表:
1—》2—》3—》4—》5—》6—》7—》None - 反转后链表:
None《—1《—2《—3《—4《—5《—6《—7
每次都为两两之间的指针反转,因此先考虑假如只有两个节点时候该如何反转。
1—》2—》None,设pHead为原始头节点,
temp = pHead.next # 存第二个节点信息
pHead.next = None # 让第一个节点作为尾结点,指向空节点
temp.next = pHead # 改变节点指向,让第二个节点反向指向头结点
再来考虑三个反转的情况:1—》2—》3—》None
# 存储第二个节点信息
temp1 = pHead.next
# 存储第三个节点信息,保证在反转前两个节点时候,不影响第三个节点
temp2 = temp1.next
# 反转前两个
pHead.next = None
temp1.next = pHead
# 将第三个节点指向原来的第二个节点,完成反转
temp2.next = temp1
现在再来考虑一下我们的题目,本题的节点个数,当等于或大于三个时解题方式,其实与上面反转三个时相同。即每次先获取第三个节点,然后反转前两个节点,反转完之后再将第三个节点与前两个节点连接即可。而每次都需要一个变量存到第三个节点的值,由于在链表的最后为None,可设置一个变量存入None作为空节点,每次通过移动三个指针变量即可完成全部的反转。
边界条件:当节点为空节点或只有一个节点时,输出自身情况即可。
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
if not pHead or not pHead.next:
return pHead
last = None # 作为空节点
while pHead:
temp = pHead.next # 存入pHead的下一个节点信息
pHead.next = last # 改变pHead的指向,指向之前的节点
last = pHead # 移动last到它的下一个节点(pHead)
pHead = temp # 移动pHead到它的下一个节点(temp)
return last
总结:
考虑链表问题,要注意node.next在等号左侧时,为node节点的指针将指向哪个地址的信息;node.next在等号右侧时,为node.next节点的信息。这块容易搞混,思考时候要注意。