python实现单链表的翻转

关于线性表的实现可以参考: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,表示已经遍历完整个链表。
最后,返回翻转后的链表的头节点,即原链表的尾节点,因为在翻转后,原链表的尾节点成为了新链表的头节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值