链表是一种数据结构,它由一系列节点组成。每个节点都包含数据和指向下一个节点的指针。以下是链表的重要知识点:
单链表:链表中每个节点只有一个指针,指向下一个节点。它可以用于实现栈和队列等数据结构。
以下是一个简单的单链表的实现代码:
classNode:
def__init__(self, value):
self.value = value
self.next = NoneclassLinkedList:
def__init__(self):
self.head = Nonedefadd_node(self, value):
new_node = Node(value)
if self.head isNone:
self.head = new_node
else:
current = self.head
while current.nextisnotNone:
current = current.next
current.next = new_node
defremove_node(self, value):
current = self.head
previous = None
found = Falsewhilenot found:
if current.value == value:
found = Trueelse:
previous = current
current = current.nextif previous isNone:
self.head = current.nextelse:
previous.next = current.nextdefprint_list(self):
current = self.head
while current isnotNone:
print(current.value)
current = current.next
链表的插入和删除操作:在链表中插入或删除一个节点,只需要修改前一个节点或后一个节点的指针即可。
链表插入操作(在链表头部插入):
classNode:
def__init__(self, data=None, next=None):
self.data = data
self.next = nextclassLinkedList:
def__init__(self):
self.head = Nonedefinsert(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
defprint_list(self):
node = self.head
while node:
print(node.data, end=" ")
node = node.next# 测试
llist = LinkedList()
llist.insert(1)
llist.insert(2)
llist.insert(3)
llist.print_list() # 输出:3 2 1
链表删除操作(删除链表头部的元素):
definsert(self, data):
new_node = Node(data)
new_node.next = self.head
self.head = new_node
defdelete(self):
ifnot self.head:
returnNone
temp = self.head.data
self.head = self.head.nextreturn temp
defprint_list(self):
node = self.head
while node:
print(node.data, end=" ")
node = node.next
链表的遍历:遍历链表中的所有节点,可以使用迭代或递归方式实现。
要正向遍历链表,最基本的方法是使用一个指针从链表头节点开始往后遍历,直到遍历到链表尾部结束。具体的代码实现如下:
voidtraverse(ListNode* head){
ListNode* p = head;
while (p != nullptr) {
// 处理当前节点// ...
p = p->next;
}
}
在上面的代码中,p 是一个指向节点的指针,从链表头节点开始,逐个往后遍历。每遍历到一个节点,都可以对其进行处理,比如输出节点值或者进行一些其他操作。遍历的过程中,我们需要注意判断节点是否为空,以免程序崩溃。
在链表的遍历中,我们通常使用的是 while 循环,也可以使用 for 循环,不过要比 while 循环麻烦一些。具体的实现如下:
voidtraverse(ListNode* head){
for (ListNode* p = head; p != nullptr; p = p->next) {
// 处理当前节点// ...
}
}
无论是 while 循环还是 for 循环,最终都会遍历完整个链表,所以这两种方式都可以用于链表的正向遍历。需要根据实际情况选择具体的实现方式。
链表的应用:链表可以用于实现栈、队列、LRU缓存、有序列表等数据结构。它也常用于算法题目中,如链表的合并、反转、排序等问题。