菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

DSA 链表类型


链表类型

链表有三种基本形式

  1. 单向链表
  2. 双向链表
  3. 循环链表

单向链表是最简单的链表类型。它占用的内存空间较少,因为每个节点只有一个指向下一个节点的地址,如下图所示。

A singly linked list.

双向链表的节点同时包含指向前一个节点和下一个节点的地址,如下图所示,因此占用的内存更多。但双向链表适合需要双向遍历列表的场景。

A doubly linked list.

循环链表类似于单向或双向链表,但第一个节点(“头”)和最后一个节点(“尾”)相互连接。

在单向或双向链表中,我们可以通过检查链接是否为 null 来找到列表的开始和结束。但对于循环链表,在某些应用程序中需要更复杂的代码来显式检查开始和结束节点。

循环链表适用于需要连续循环遍历的列表。

下图是一个单向循环链表的例子

A circular singly linked list.

下图是一个双向循环链表的例子

A circular doubly linked list.

注意:您需要的链表类型取决于您要解决的问题。


链表实现

以下是基本实现的

  1. 单向链表
  2. 双向链表
  3. 循环单向链表
  4. 循环双向链表

下一页将介绍链表可以执行的不同操作。


1. 单向链表实现

以下是此单向链表的实现

A singly linked list with values.

示例

Python 中的基本单向链表

(这是与上一页底部相同的示例。)

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
    
node1 = Node(3)
node2 = Node(5)
node3 = Node(13)
node4 = Node(2)

node1.next = node2
node2.next = node3
node3.next = node4

currentNode = node1
while currentNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.next
print("null")
运行示例 »

2. 双向链表实现

以下是此双向链表的实现

A doubly linked list with values.

示例

Python 中的基本双向链表

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        self.prev = None
    
node1 = Node(3)
node2 = Node(5)
node3 = Node(13)
node4 = Node(2)

node1.next = node2

node2.prev = node1
node2.next = node3

node3.prev = node2
node3.next = node4

node4.prev = node3

print("\nTraversing forward:")
currentNode = node1
while currentNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.next
print("null")

print("\nTraversing backward:")
currentNode = node4
while currentNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.prev
print("null")
运行示例 »


3. 循环单向链表实现

以下是此循环单向链表的实现

A circular singly linked list with values.

示例

Python 中的基本循环单向链表

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
    
node1 = Node(3)
node2 = Node(5)
node3 = Node(13)
node4 = Node(2)

node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node1

currentNode = node1
startNode = node1
print(currentNode.data, end=" -> ") 
currentNode = currentNode.next 

while currentNode != startNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.next

print("...")
运行示例 »

第 14 行:这使得单向列表成为循环的。

第 17 行:程序通过此方式知道何时停止,以便它只遍历列表一次。


4. 循环双向链表实现

以下是此循环双向链表的实现

A circular doubly linked list with values.

示例

Python 中的基本循环双向链表

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

node1 = Node(3)
node2 = Node(5)
node3 = Node(13)
node4 = Node(2)

node1.next = node2
node1.prev = node4

node2.prev = node1
node2.next = node3

node3.prev = node2
node3.next = node4

node4.prev = node3
node4.next = node1

print("\nTraversing forward:")
currentNode = node1
startNode = node1
print(currentNode.data, end=" -> ")
currentNode = currentNode.next

while currentNode != startNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.next
print("...")

print("\nTraversing backward:")
currentNode = node4
startNode = node4
print(currentNode.data, end=" -> ")
currentNode = currentNode.prev

while currentNode != startNode:
    print(currentNode.data, end=" -> ")
    currentNode = currentNode.prev
print("...")
运行示例 »

第 13 行和第 22 行:这些链接使双向链表成为循环的。

第 26 行:程序通过此方式知道何时停止,以便它只遍历列表一次。


DSA 练习

通过练习来测试自己

练习

看一下这个单向链表

A singly Linked List

如何使这个链表成为循环的?

The list can be made circular 
by connecting the next pointer 
in the last node, to the  node.

开始练习



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持