数据结构必会|链表的思想和实现(Python)

简介: 链表的思想和实现

链表

1. 链表的概念

​ 链表的结构就像平时生活中所见到的锁链一样,是一种一环套着一环的结构。在数据结构的链表中,每一环都由“数据域”和“指针域”两部分构成。具体结构如下图所示:

在这里插入图片描述

​ 如图所示就是链表的结构,数据域用户存储当前结点的元素信息,指针域用于链接下一个结点,需要注意的是链表是无序的,也就是说我们只需要维持元素之间的相对位置,并不需要在连续的内存空间中维护这些位置信息。

2. 链表的创建

​ 链表的创建和它的原理一样,我们需要对每个结点进行初始化,结点中包含着数据域data和指针域next,有了结点之后还需要制定结点的指向函数使得结点之间能够链接起来,具体的实现方法如下:

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

    # 获取节点的值
    def getData(self):
        return self.data

    # 获取下一个节点地址
    def getNext(self):
        return self.next

    # 设置节点的值
    def setData(self, newData):
        self.data = newData

    # 设置节点指向
    def setNext(self, newnext):
        self.next = newnext

​ 测试结果如下:

# 设置结点的数据域
temp1 = Node(93)
temp2 = Node(94)
temp3 = Node(95)

# 设置结点指针指向的位置
temp1.next = temp2
temp2.next = temp3
temp1.setNext(temp3)

# 获取结点的值
temp2.getNext().getData()

# 输出
95

3. 链表功能的实现

​ 对于链表来说,除了创建链表之外,我们还需要创建一个类来实现链表的功能。

  • printlink:实现链表的打印;
  • length:实现链表长度的计算;
  • search:实现链表中元素的查找;
  • remove:实现链表中元素的移除。

​ 具体的实现方式如下:

class UnorderedList:
    # 没有元素构建一个空列表
    def __init__(self):
        self.head = None

    # 判断列表是否为空
    def isEmpty(self):
        return self.head == None

    # 添加节点
    def add(self, item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp

    # 遍历链表
    def printlink(self):
        if self.head == None:
            print("该链表为空链表!")
        p = self.head
        while p != None:
            print(p.getData(), end="->")
            p = p.getNext()

    # 链表的长度
    def length(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()
        return count

    # 查找元素
    def search(self, item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
        return found

    # 移除元素
    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

​ 测试结果如下:

# 设置结点的数据域
temp1 = Node(93)
temp2 = Node(94)
temp3 = Node(95)

# 设置结点指针指向的位置
linklist = UnorderedList()
linklist.head = temp1
temp1.next = temp2
temp2.next = temp3

# 使用功能类中的add进行元素的添加
linklist.add(9)
# 打印链表长度
print(linklist.length())

# 输出
4

​ 使用循环构造链表:

link_list = UnorderedList()
for i in range(5):
    link_list.add(i)
node = link_list.head
node.getData()

# 输出
4
相关文章
|
18天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
45 4
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
26 7
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
23 3
|
1月前
|
Python
Python 中常见的数据结构(二)
Python 中常见的数据结构(二)
|
1月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
16 0
数据结构与算法学习五:双链表的增、删、改、查
|
1月前
|
存储 索引 Python
Python 中常见的数据结构(一)
Python 中常见的数据结构(一)
|
18天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
38 0
|
1月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
22 0