关于线性表的实现可以参考:python实现线性表
单链表的翻转操作是指将链表中节点的指针方向反转,使得原先指向下一个节点的指针指向前一个节点,最终形成一个逆序的链表。
python实现单链表的翻转实现思路:
从头指针开始遍历,先获取头指针的下一个结点保留,然后调整头指针的指向,然后再把之前保留的节点赋给头结点,继续遍历
不带头结点
class LinkNode(object):
def __init__(self, elem):
self.elem = elem
self.next = next
class Linklist(object):
def __init__(self):#单链表头指针为空
self.head=None
#翻转链表
def reverseList(self):
if self.head == None or self.head.next == None: # 若链表为空或者仅一个数就直接返回
return self.head
pre = None
while (self.head != None):
next = self.head.next #为了防止断链
self.head.next = pre#链表转向
pre = self.head #pre就是一个临时值,用于链表指针的转向的同时防止断链
self.head = next#继续往前走
return pre
#头插法建表
def headcreatelink(self,elem):
nod=LinkNode(elem)
nod.next=self.head
self.head=nod
#链表遍历
def travelList(self):
res=[]
nod=self.head
while nod!=None:
res.append(nod.elem)
nod=nod.next
return res
if __name__ == '__main__':
l1=Linklist()
rr=LinkNode(None)
for i in range(5):
l1.headcreatelink(i)
t=l1.travelList()
print(t)
#得到翻转后的头指针
s=l1.reverseList()
print(type(s))
while s!=None:
print(s.elem)
s=s.next
运行结果为:
[4, 3, 2, 1, 0]
<class '__main__.LinkNode'>
0
1
2
3
4
带头结点
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
def reverse_linked_list(head):
prev_node = None # 初始化前一个节点为None
curr_node = head # 当前节点指向链表的头节点
while curr_node: # 遍历链表
next_node = curr_node.next # 暂存当前节点的下一个节点
curr_node.next = prev_node # 将当前节点的指针指向前一个节点
# 更新prev_node和curr_node,继续向后遍历
prev_node = curr_node
curr_node = next_node
return prev_node # 返回翻转后的链表的头节点
# 创建一个示例链表:1 -> 2 -> 3 -> 4 -> 5
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
# 翻转链表
new_head = reverse_linked_list(head)
# 打印翻转后的链表
while new_head:
print(new_head.value, end=" ")
new_head = new_head.next
这段代码的实现思路如下:
定义了一个 ListNode 类来表示单链表的节点,每个节点包含一个 value 值和一个 next 指针指向下一个节点。 编写了reverse_linked_list 函数来实现单链表的翻转。该函数接受一个头节点 head 作为输入参数。 在reverse_linked_list 函数中,我们使用三个指针 prev_node、curr_node 和 next_node来迭代地遍历链表。初始时,prev_node 被设置为 None,curr_node 指向头节点。 在循环中,我们先暂存当前节点的下一个节点next_node,然后将当前节点的 next 指针指向前一个节点 prev_node,实现了指针的翻转。 更新 prev_node 和curr_node 的值,继续向后遍历链表,直到 curr_node 为 None,表示已经遍历完整个链表。
最后,返回翻转后的链表的头节点,即原链表的尾节点,因为在翻转后,原链表的尾节点成为了新链表的头节点。