剑指offer系列-面试题24-反转链表(python)

文章目录

  • 1.题目
  • 2. 解题思路
  • 3. 代码实现
  • 4.总结
  • 5.参考文献

1.题目

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点(也就是咱常说的单链表逆序),链表节点定义如下:

struct ListNode
{
	int m_nKey;
	ListNode* m_pNext;
}

python版

class ListNode(object):
	def __init__(self, value, next_node=None):
		self.value = value
		self.next = next_node

2. 解题思路

诚如本书作者所言,解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。最好利用画图来分析。

从图2来看,节点j到节点i,要实现反转必须先保存节点i的next,否则节点j和节点i就会断开。

与链表相关的问题,总是伴随着大量的指针操作,那么此题应该也离不开指针的操作。指针在python中对应的就是引用,也就是需要大量引用的操作,也即是需要修改引用。只要我们能够实现一个节点的反转,然后不断递推下去,就能够实现整个链表的反转了


a
b
...
h
i
j
....
....
j
i
h
...
b
a

3. 代码实现

def reverse_list(head):
	if head == None:
		return
	pre = head # 前一节点
	cur = head.next # 当前节点,从head.next开始
	head.next = None # 让头节点,也就是反转之后的尾节点指向None
	while cur:
		temp = cur.next # 1. 保存当前节点的下一个节点
		cur.next =pre # 2. 反转指针,当前节点指向从后一个节点变成前一个节点
		pre = cur # 3. 当前节点成为前一节点
		cur = temp # 4. 当前节点的下一节点成为当前节点
	# 当cur==None时,退出循环,那么pre就是原来链表的尾节点,反转之后链表的头节点了
	return pre

# 从头节点开始反转应该也是可以的
def reverse_list(head):
	cur = head # 当前节点,从head开始
	pre = None # 前一节点,初始值为None
	while cur:
		temp = cur.next # 1. 保存当前节点的下一个节点
		cur.next =pre # 2. 反转指针,当前节点指向从后一个节点变成前一个节点
		pre = cur # 3. 当前节点成为前一节点
		cur = temp # 4. 当前节点的下一节点成为当前节点
	# 当cur==None时退出循环,那么pre就是原来的尾节点,反转之后的头节点了
	return pre

4.总结

链表总是伴随着大量的指针操作。反转链表应该分解为反转链表中的每个节点的指针(引用),只要能反转一个指针,就能递推下去。

5.参考文献

[1]剑指offer丛书

你可能感兴趣的:(算法,算法,剑指offer,python,面试)