链表知识点

本文介绍了链表的基本概念,包括单链表的结构及其在数据结构中的应用。详细阐述了链表的插入、删除操作,特别是头部插入和删除的实现。同时,讨论了链表的正向遍历,提供了迭代和递归两种方法,并对比了while循环和for循环在遍历链表时的使用。最后,提到了链表在栈、队列、LRU缓存等数据结构中的应用。
摘要由CSDN通过智能技术生成

链表是一种数据结构,它由一系列节点组成。每个节点都包含数据和指向下一个节点的指针。以下是链表的重要知识点:

  1. 单链表:链表中每个节点只有一个指针,指向下一个节点。它可以用于实现栈和队列等数据结构。

以下是一个简单的单链表的实现代码:

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
  1. 链表的插入和删除操作:在链表中插入或删除一个节点,只需要修改前一个节点或后一个节点的指针即可。

链表插入操作(在链表头部插入):

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
  1. 链表的遍历:遍历链表中的所有节点,可以使用迭代或递归方式实现。

要正向遍历链表,最基本的方法是使用一个指针从链表头节点开始往后遍历,直到遍历到链表尾部结束。具体的代码实现如下:

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 循环,最终都会遍历完整个链表,所以这两种方式都可以用于链表的正向遍历。需要根据实际情况选择具体的实现方式。

  1. 链表的应用:链表可以用于实现栈、队列、LRU缓存、有序列表等数据结构。它也常用于算法题目中,如链表的合并、反转、排序等问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值