原始单链表:

反转后单链表:

反转过程如下:

1、next = head.next, 将head.next赋值给next变量,即next指向了节点2,先将节点2保存起来。
2、head.next = pre (初始pre==None), 将pre变量赋值给head.next,即此时节点1指向了None。
3、pre=head,即pre指向节点1,将节点1设为“上一个节点”。
4、head=next,将head指向节点2,此时节点2位“头节点”。
第一次循环完毕,进入第二次循环,如下图:

1、next = head.next, 将head.next赋值给next变量,即next指向了节点3,先将节点3保存起来。
2、head.next = pre (此时pre不为None), 将pre变量赋值给head.next,pre在上一次循环时指向节点1,
那么这一步的意义就是节点2 指向了 节点1,完成1和2节点的反转
。
3、pre=head,将head赋值给pre,即pre指向节点2,将节点2设为“上一个节点”。
4、head=next,将next赋值给head,即head指向节点3,此时节点3为“头节点”。
第二次循环完毕,以此类推!第三次第四次第五次循环。最后反转成如下图:

若干注意点:
(1)帮助记忆图:
(2)当前头节点的下一个节点一定要保存(比如:当前头节点为2,先将节点3 保存起来)
(3)实现反转的key point:head.next = pre
1、反转链表代码
# -*- coding: utf-8 -*-
class Node(object): # 链表结构
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
def reverse_list(head):
if head is None or head.next is None: # 若链表为空或者仅一个数就直接返回
return head
pre = None
next = None
while (head is not None):
next = head.next # 1 保存当前头节点的下一个节点
head.next = pre # 2 反转
pre = head # 3 上一个节点
head = next # 4 新的头节点
return pre
if __name__ == '__main__':
old_node = Node(3) # 建立链表3->2->1->9->None
old_node.next = Node(2)
old_node.next.next = Node(1)
old_node.next.next.next = Node(9)
print("old_node:%s" % old_node) # old_node:<__main__.Node object at 0x000001F745760DA0>
new_node = reverse_list(old_node)
print(new_node.elem, new_node.next.elem, new_node.next.next.elem, new_node.next.next.next.elem) # 9 1 2 3
2、递归法对链表反转
# -*- coding: utf-8 -*-
class Node(object): # 链表结构
def __init__(self, elem, next_=None):
self.elem = elem
self.next = next_
def reverse_list(head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head;
return None
if not head.next: # 若链表为空或者仅一个数就直接返回
return head
new_headNode = reverse_list(head.next)
head.next.next = head
head.next = None
return new_headNode
if __name__ == '__main__':
old_node = Node(3) # 建立链表3->2->1->9->None
old_node.next = Node(2)
old_node.next.next = Node(1)
old_node.next.next.next = Node(9)
print("old_node:%s" % old_node) # old_node:<__main__.Node object at 0x000001F745760DA0>
new_node = reverse_list(old_node)
print(new_node.elem, new_node.next.elem, new_node.next.next.elem, new_node.next.next.next.elem) # 9 1 2 3