反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
- show the code:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
reversehead = None
p = head
p_pre = None
while p:
p_next = p.next
if not p_next:
reversehead = p
p.next = p_pre
p_pre = p
p = p_next
return reversehead
- 此题属于经典题,之前做过很多次了,拿到之后还是无从下手。。。剑指offer上讲的很详细,关键是考虑清楚三个节点的情况,其中现有遍历的节点指针指向其之前的节点,这里特别注意,为了防止链表断开,我们需要事先保存好现在节点的下一个节点,所以总的来说会有四个变量:
reversehead反转后的头节点,p现有遍历到的节点,p_pre现有节点的上一个节点,p_next现有节点的下一个节点
- 理清这个情况之后就简单了,接下来需要判断循环终止条件。考虑到反转后的链表头节点是反转前链表的尾节点,所以当
p_next是None
时说明链表遍历结束,反转结束。