单链表的Python实现

本文介绍了如何使用Python实现单链表的数据结构。首先定义了节点类,并在此基础上实现了单链表类,提供了在首部、尾部或任意位置插入节点,从首部、尾部或任意位置删除节点等功能。

单链表的Python实现

一、节点

节点,即C语言里使用struct语句定义的一种非基础数据类型,在Python中,定义一个class类。

class Node(object):
'''包含一个数据域,一个next域的节点,next是对下一个数据的引用'''
def __init__(self, data, next=None):
    self.data = data
    self.next = next


class TwoWayNode(Node):
'''继承Node类的双指针节点类,新包含一个previous的引用'''
def __init__(self, data, previous=None, next=None):
    Node.__init__(self, data, next)
    self.previous = previous


def main():
    pass

if __name__ == "__main__":
    main()

二、单链表

单链表,指的是由多个节点形成的链式结构,一个节点包括一个数据域及一个next域。
除头结点外,每个节点都有且仅有一个前驱;除尾节点外,每个节点有且仅有一个后继。
ADT思想(忽略)。
定义一个单链表类,依次给出以下的方法:
* 1、 在首部插入节点
* 2、在尾部插入节点
* 3、在任意位置插入节点
* 4、从首部删除节点
* 5、从尾部删除节点
* 6、从任意位置删除节点
* 7、遍历输出
* 8、根据数值查找单链表中是否存在项,返回True or False及索引位置
* 9、根据给出的索引替换掉相应位置的值

from node import Node

class SingleList(object):
'''以节点的方式实现链表,默认实现空列表'''
    def __init__(self):
        self.head = None

    # 在开始处插入
    def add_node_first(self, data):
        self.head = Node(data, self.head)

    # 在末尾插入,若为空列表则直接插入,否则遍历到尾部
    def add_node_last(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
        else:
            probe = self.head
            while probe.next is not None:
                probe = probe.next
            probe.next = new_node

    # 任意位置添加节点,若index小于零,加在首部,若index大于链表长度,加在尾部
    def add_node_anywhere(self, index, data):
        if self.head is None or index <= 0:
            self.head = Node(data, self.head)
        else:
            probe = self.head
            while index >1 and probe.next is not None:
                probe = probe.next
                index -= 1
            probe.next = Node(data, probe.next)

    # 从首部删除节点
    def pop_node_first(self):
        if self.head is not None:
            removed_item = self.head.data
            self.head = self.head.next
            return removed_item
        else:
            return -1

    # 从尾部删除节点
    def pop_node_last(self):
        if self.head is None:
            return -1
        elif self.head.next is None:
            removed_item = self.head.data
            self.head = None
        else:
            probe = self.head
            while probe.next.next is not None:
                probe = probe.next
            removed_item = probe.next.data
            probe.next = None
        return removed_item

    # 任意位置删除节点,若index小于零,则删除首部节点,若index大于链表长度,则删除尾部节点
    def pop_node_anywhere(self, index):
        if index <= 0 or self.head.next is None:
            removed_item = self.head.data
            self.head = self.head.next
            return removed_item
        else:
            probe = self.head
            while index > 1 and probe.next.next is not None:
                probe = probe.next
                index -= 1
            removed_item = probe.next.data
            probe.next = probe.next.next
            return removed_item

    # 遍历输出
    def traverse(self):
        probe = self.head
        while probe is not None:
            print(probe.data)
            probe = probe.next

    # 根据数值查找链表有没有该数据
    def search(self, data):
        probe = self.head
        cnt = 0
        while probe is not None and data != probe.data:
            probe = probe.next
            cnt += 1
        if probe is not None:
            return "In", cnt
        else:
            return "Not in", -1

    # 根据索引位置替换数据
    def replace(self, index, new_data):
        probe = self.head
        while index > 0 and probe is not None:
            probe = probe.next
            index -= 1
        if probe is None:
            return -1
        else:
            probe.data = new_data
            return "Done"


# 测试用例
a = SingleList()
a.add_node_first(1)
a.add_node_first(2)
a.add_node_first(3)
print(a.search(2))
a.add_node_first(4)
a.add_node_last(5)
a.add_node_first(6)
a.add_node_anywhere(100,33)
a.pop_node_anywhere(2)
a.traverse()

print("--------")
### Python 实现单链表Python实现单链表涉及定义节点类 `Node` 和链表类 `LinkedList`。通过这些类可以方便地管理数据项并执行各种操作。 #### 定义 Node 类 每个节点存储两个部分:一个是数据域,另一个是指向下一个节点的指针。这可以通过创建一个名为 `Node` 的类来完成: ```python class Node: def __init__(self, data=None): self.data = data # 节点的数据 self.next = None # 下一节点引用 ``` 此代码片段展示了如何初始化一个新的节点实例[^1]。 #### 创建 LinkedList 类 为了更好地管理和操纵多个节点组成的列表,通常会定义一个额外的 `LinkedList` 类作为容器: ```python class LinkedList: def __init__(self): self.head = None # 初始化为空链表 def append(self, new_data): new_node = Node(new_data) if not self.head: self.head = new_node return last = self.head while last.next: last = last.next last.next = new_node def print_list(self): current = self.head while current: print(current.data) current = current.next ``` 这段程序实现了基本功能,比如添加新元素到链表末端以及遍历整个链表打印其内容[^2]。 #### 插入、删除和其他常见方法 除了上述基础功能外,还可以扩展更多实用的方法,例如插入特定位置的新节点或者移除现有节点等功能。对于更复杂的场景,则可能需要考虑双向链接或其他变体形式。 ```python def insert_after(self, prev_node, new_data): if not isinstance(prev_node, Node): raise TypeError('prev_node must be a Node instance') new_node = Node(new_data) new_node.next = prev_node.next prev_node.next = new_node def delete_node(self, key): temp = self.head if (temp and temp.data == key): self.head = temp.next temp = None return while(temp and temp.data != key): prev = temp temp = temp.next if temp is None: return prev.next = temp.next temp = None ``` 这里提供了两种典型的操作——在一个给定节点之后插入新的节点和按值查找并删除指定节点[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值