python数据结构之单向链表

1、链表的定义和结构

链表的定义:是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接

链表的结构:data为自定义的数据,next为下一个节点的地址。

2、基本元素

节点:每个节点有两个部分,左边称为值域,存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
节点类定义如下,我们将节点类定义成Node,该类在初始化实例对象时,定义了两个实例变量,其中data用来存储节点的值,next用来存储下一个节点的索引。

head: head节点永远指向第一个节点;
tail: tail永远指向最后一个节点;
None: 链表中最后一个节点的指针域为None值;

3、链表种类

单向链表、单向循环链表、双向链表、双向循环链表

4、手动创建链表示例

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

# 创建三个节点
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)

# 手动链接三个节点
node1.next = node2
node2.next = node3

5、单链表实现

#先定一个node的类
class Node():                  #value + next
    def __init__ (self, value = None, next = None):
        self._value = value
        self._next = next
 
    def getValue(self):
        return self._value
 
    def getNext(self):
        return self._next
 
    def setValue(self,new_value):
        self._value = new_value
 
    def setNext(self,new_next):
        self._next = new_next
 
# 实现Linked List及其各类操作方法
class LinkedList():
    def __init__(self):      # 初始化链表为空表
        self._head = Node() 
        self._tail = None
        self._length = 0
 
    # 检测是否为空
    def isEmpty(self):
        return self._head == None
 
    # add在链表前端添加元素:O(1)
    def add(self,value):
        newnode = Node(value,None)    # create一个node(为了插进一个链表)
        newnode.setNext(self._head)   
        self._head = newnode
 
    # append在链表尾部添加元素:O(n)
    def append(self,value):
        newnode = Node(value)
        if self.isEmpty():
            self._head = newnode   # 若为空表,将添加的元素设为第一个元素
        else:
            current = self._head
            while current.getNext() != None:
                current = current.getNext()   # 遍历链表
            current.setNext(newnode)   # 此时current为链表最后的元素
 
    # search检索元素是否在链表中
    def search(self,value):
        current=self._head
        foundvalue = False
        while current != None and not foundvalue:
            if current.getValue() == value:
                foundvalue = True
            else:
                current=current.getNext()
        return foundvalue
 
    # index索引元素在链表中的位置
    def index(self,value):
        current = self._head
        count = 0
        found = None
        while current != None and not found:
            count += 1
            if current.getValue()==value:
                found = True
            else:
                current=current.getNext()
        if found:
            return count
        else:
            raise ValueError ('%s is not in linkedlist'%value)
 
    #remove删除链表中的某项元素
    def remove(self,value):
        current = self._head
        pre = None
        while current!=None:
            if current.getValue() == value:
                if not pre:
                    self._head = current.getNext()
                else:
                    pre.setNext(current.getNext())
                break
            else:
                pre = current
                current = current.getNext()
 
    #insert链表中插入元素
    def insert(self,pos,value):
        if pos <= 1:
            self.add(value)
        elif pos > self.size():
            self.append(value)
        else:
            temp = Node(value)
            count = 1
            pre = None
            current = self._head
            while count < pos:
                count += 1
                pre = current
                current = current.getNext()
            pre.setNext(temp)
            temp.setNext(current)

参考:
https://blog.csdn.net/qq_30815237/article/details/90750349

posted @   星空28  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示