数据结构:链表(Python语言实现)

链表分为单链表、双链表、循环单链表和循环双链表。

本文以单链表为例,用python创建一个单链表数据结构,同时定义链表节点的增加、删除、查询和打印操作。

一、创建节点类

创建一个名为Node的节点类,节点类里面包含2个属性和1个方法。

  1. 节点类的属性

分别为data数据域属性和next指针域属性。

  1. 节点类的方法

has_value()方法,判断节点的值是否等于某个值。

# 创建节点类
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        return
    def has_value(self, value):
        if self.data == value:
            return True
        else:
            return False

二、创建单链表类

创建一个名为singlelink的单链表类,其中包含3个属性和7个方法。

  1. 单链表类的属性

头结点head、尾节点tail和链表长度length。

  1. 单链表类的方法

(1)__init__():初始化方法。

(2)isempty():判断链表是否为空。

(3)add_node():在链表尾部添加一个节点。

(4)insert_node():在链表中的某个位置(从1开始)插入一个节点。

(5)delete_node_byid():通过位置(从1开始),在链表中删除对应的节点。

(6)find_node():查找某个值在链表中所在的位置(从1开始)。

(7)print_link():按顺序打印链表的值。

注意:insert_node()、delete_node_byid()和find_node()方法中的位置指从1开始计数,并非按python中列表索引值从0开始。

(一)__init__()

# 创建一个单链表类
class singlelink:
    # 初始化方法
    def __init__(self):
        self.head = None
        self.tail = None
        self.length = 0
        return

(二)isempty()

    # 判断链表是否为空
    def isempty(self):
        if self.length == 0:
            return True
        else:
            return False

(三)add_node()

    # 向链表尾部添加一个节点
    def add_node(self, item):
        if not isinstance(item, Node):  # 判断item是否是Node类型
            item = Node(item)   # 创建新节点
        if self.head is None:
            self.head = item
            self.tail = item
        else:
            self.tail.next = item
            self.tail = item
        self.length += 1
        return

(四)insert_node()

# 在链表中插入一个结点
    def insert_node(self, index, data):
        if self.isempty():
            print('this link is empty')
            return
        if index < 1 or index > self.length + 1:    # 插入序号不能大于长度或小于0
            print('error: out of index')
            return
        item = Node(data)
        if index == 1:
            item.next = self.head
            self.head = item
            self.length += 1
            return
        j = 1
        node = self.head
        prev = self.head
        while node.next and j < index:
            prev = node
            node = node.next
            j += 1
        if j == index:  # 在链表中间添加元素
            item.next = node
            prev.next = item
            self.length += 1
            return
        if node.next is None:  # 在链表尾部添加元素
            self.add_node(item)

(五)delete_node_byid()

# 通过索引,在链表中删除节点
    def delete_node_byid(self, item_id):
        if self.isempty():
            print('this link is empty, Unable to delete')
            return
        if item_id < 1 or item_id > self.length:
            print('error:out of index,Unable to delete')
        id = 1
        current_node = self.head
        previous_node = None
        while current_node is not None:
            if id == item_id:
                if previous_node is not None:
                    previous_node.next = current_node.next
                    return
                else:
                    self.head = current_node.next   # 删除头结点的情况
                    return
            previous_node = current_node
            current_node = current_node.next
            id += 1
        self.length -= 1
        return

(六)find_node()

# 通过数值,在链表中找到节点(返回该节点的所有位置)
    def find_node(self, value):
        current_node = self.head
        node_id = 1
        result = []
        while current_node is not None:
            if current_node.has_value(value):
                result.append(node_id)
            current_node = current_node.next
            node_id += 1
        return result

(七)print_link()

    def print_link(self):
        currrent_node = self.head
        while currrent_node is not None:
            print(currrent_node.data)
            currrent_node = currrent_node.next
        return

创建单链表,并进行增加、删除、查询等操作

# 创建三个节点
Node1 = Node('a')
Node2 = Node('b')
Node3 = Node('c')

# 定义一个空链表
link = singlelink()

# 判断是否是空链表
print(link.isempty())

# 尾部添加结点
for node in [Node1, Node2, Node3]:
    link.add_node(node)

# 在链表中插入位置
link.insert_node(2, 'e')
link.insert_node(4, 'f')
link.insert_node(4, 'f')
link.insert_node(8, 'h') # 无法插入

# 打印链表
link.print_link()
print('*****************')

# 删除元素
link.delete_node_byid(2)
link.print_link()

print('*****************')
# 查找元素
node_ids = link.find_node('f') # 查询元素5的位置
if len(node_ids) == 0:
    print('链表中无此元素')
else:
    print(node_ids)

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python 是一种高级语言,其语法简单易懂,非常适合用来实现数据结构算法。下面介绍几种常用的数据结构算法Python 实现。 1. 数组 在 Python 中,可以用列表(list)来实现数组。例如,以下代码实现了一个长度为 5 的整型数组: ``` arr = [0] * 5 ``` 2. 栈 栈是一种后进先出(LIFO)的数据结构,可以用 Python 的列表来实现。例如,以下代码实现了一个栈: ``` stack = [] # 初始化一个空栈 # 入栈 stack.append(1) stack.append(2) stack.append(3) # 出栈 top = stack.pop() # 弹出栈顶元素(3) ``` 3. 队列 队列是一种先进先出(FIFO)的数据结构,可以用 Python 的列表来实现。例如,以下代码实现了一个队列: ``` queue = [] # 初始化一个空队列 # 入队 queue.append(1) queue.append(2) queue.append(3) # 出队 front = queue.pop(0) # 弹出队首元素(1) ``` 4. 链表 链表是一种通过指针链接各个节点的数据结构,可以用 Python 的类来实现。例如,以下代码实现了一个链表节点和链表: ``` class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class LinkedList: def __init__(self): self.head = None # 在链表末尾插入一个节点 def append(self, val): if not self.head: self.head = ListNode(val) else: curr = self.head while curr.next: curr = curr.next curr.next = ListNode(val) # 删除链表中第一个值为val的节点 def delete(self, val): if not self.head: return if self.head.val == val: self.head = self.head.next return curr = self.head while curr.next: if curr.next.val == val: curr.next = curr.next.next return curr = curr.next ``` 5. 递归 递归是一种通过函数调用自身来解决问题的方法,可以用 Python 的函数来实现。例如,以下代码实现了一个递归函数,计算斐波那契数列第 n 项的值: ``` def fib(n): if n == 0 or n == 1: return n return fib(n-1) + fib(n-2) ``` 6. 排序 排序是一种将数据按照指定规则进行排序的算法,可以用 Python 的内置函数来实现。例如,以下代码实现了一个简单的选择排序: ``` def selection_sort(arr): n = len(arr) for i in range(n): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] ``` 以上是 Python 实现常用的数据结构算法的简单介绍,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值