python实现链表

链表简介

链表是一种常见的数据结构,它通过一系列节点在内存中按顺序存储和表示数据。每个节点由两部分组成:数据域和指针域。数据域用于存储节点的数据,指针域用于存储下一个节点的地址。

链表的特点

  • 链表中的节点在内存中是非连续的,节点是通过指针链接起来的。
  • 链表中插入和删除节点时间复杂度可以达到O(1),因为只需要改变节点的指针,而不需要移动整个链表。
  • 链表访问任何一个位置的节点时间复杂度为O(n),需要从头节点开始顺序遍历到该位置。

链表常见的操作

  • 遍历 - 从头节点开始,通过next指针访问每个节点
  • 插入 - 在任意位置插入节点
  • 删除 - 删除任意位置上的节点
  • 查找 - 查找某个数据是否存在于链表中

下面通过Python代码实现一个简单的单向链表。

Python 实现单向链表

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
    
    def print_list(self):
        cur_node = self.head
        while cur_node:
            print(cur_node.data)
            cur_node = cur_node.next

    def append(self, data):
        new_node = Node(data)
        
        if self.head is None:
            self.head = new_node
            return
        
        last_node = self.head
        while last_node.next:
            last_node = last_node.next
        last_node.next = new_node

    def prepend(self, data):
        new_node = Node(data)
        
        new_node.next = self.head
        self.head = new_node

    def insert_after_node(self, prev_node, data):

        if not prev_node:
            print("Previous node is not in the list")
            return 

        new_node = Node(data)

        new_node.next = prev_node.next
        prev_node.next = new_node

    def delete_node(self, key):

        cur_node = self.head

        if cur_node and cur_node.data == key:
            self.head = cur_node.next
            cur_node = None
            return

        prev = None 
        while cur_node and cur_node.data != key:
            prev = cur_node
            cur_node = cur_node.next

        if cur_node is None:
            return 

        prev.next = cur_node.next
        cur_node = None

    def delete_node_at_pos(self, pos):

        cur_node = self.head

        if pos == 0:
            self.head = cur_node.next
            cur_node = None
            return

        prev = None
        count = 1
        while cur_node and count != pos:
            prev = cur_node 
            cur_node = cur_node.next
            count += 1

        if cur_node is None:
            return 

        prev.next = cur_node.next
        cur_node = None

    def len_iterative(self):

        count = 0
        cur_node = self.head

        while cur_node:
            count += 1
            cur_node = cur_node.next
        return count

    def len_recursive(self, node):
        if node is None:
            return 0
        return 1 + self.len_recursive(node.next)

ll = LinkedList()
ll.append("A")
ll.append("B")
ll.append("C")
ll.append("D")

ll.delete_node("B")
ll.delete_node_at_pos(2)
ll.print_list()

print(ll.len_iterative())
print(ll.len_recursive(ll.head))

这个简单的实现演示了链表的基本结构和操作,可以处理节点的插入、删除、遍历等常见操作。链表是非常重要和常用的数据结构,在许多算法和应用中都会用到。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲人编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值