您现在的位置是:首页 >学无止境 >数据结构——链表网站首页学无止境

数据结构——链表

pruuu____d 2025-03-25 00:01:02
简介数据结构——链表

一、介绍

        链表包含若干节点,每个节点由存储单元和指针组成。即node 包括 val (存储的内容)和next(指针,指向下一节点)

        链表有单向链表和双向链表,还有循环链表。主要区别是指针。双向链表有前指针和后指针,循环链表在此基础上最后一个节点的指针指向第一个节点。

二、实现

        定义节点类

class ListNode:
    def __init__(self,val=0,next=None):#默认值为0,指针为空
        self.val=val
        self.next=next

        在节点类的基础上实现链表。链表主要有增删查改四个操作。首先定义LinkedList类,初始化头节点。

class LinkedList:
    def __init__(self):
        self.head = None
    
    # 创建链表:通过列表初始化
    def create(self, data_list):
        self.head = None
        for data in reversed(data_list):  # 反向插入保证顺序正确
            self.prepend(data)
    
    # 头部插入,插入的新节点成为新的头节点,改变指针的指向和头节点节即可
    def prepend(self, val):
        new_node = ListNode(val)
        new_node.next = self.head
        self.head = new_node
    
    # 尾部插入,如果没有头节点则创建头节点,有则在最后一个节点后加入新节点
    def append(self, val):
        new_node = ListNode(val)
        if not self.head:
            self.head = new_node
            return
        
        current = self.head
        while current.next:
            current = current.next
        current.next = new_node
    
    # 指定位置插入,分情况,在头插入,在尾插入和在中间插入,以及索引不在链表的范围内
    def insert(self, index, val):
        if index == 0:
            self.prepend(val)
            return
        
        new_node = ListNode(val)
        current = self.head
        for _ in range(index-1):
            if not current:
                raise IndexError("Index out of range")
            current = current.next
        
        if not current:
            raise IndexError("Index out of range")
        
        new_node.next = current.next
        current.next = new_node
    
    # 删除节点(按值),删除节点即将原本指向该节点的指针指向另一节点
    def delete_by_value(self, val):
        if not self.head:
            return
        
        if self.head.val == val:
            self.head = self.head.next
            return
        
        current = self.head
        while current.next:
            if current.next.val == val:
                current.next = current.next.next
                return
            current = current.next
    
    # 删除节点(按索引)
    def delete_by_index(self, index):
        if not self.head:
            raise IndexError("List is empty")
        
        if index == 0:
            self.head = self.head.next
            return
        
        current = self.head
        for _ in range(index-1):
            if not current.next:
                raise IndexError("Index out of range")
            current = current.next
        
        if not current.next:
            raise IndexError("Index out of range")
        
        current.next = current.next.next
    
    # 查找节点(按值是否存在)
    def search(self, val):
        current = self.head
        while current:
            if current.val == val:
                return True
            current = current.next
        return False
    
    # 查找节点(按索引获取值)
    def get(self, index):
        current = self.head
        for _ in range(index):
            if not current:
                raise IndexError("Index out of range")
            current = current.next
        if not current:
            raise IndexError("Index out of range")
        return current.val
    
    # 修改节点值
    def update(self, index, new_val):
        current = self.head
        for _ in range(index):
            if not current:
                raise IndexError("Index out of range")
            current = current.next
        if not current:
            raise IndexError("Index out of range")
        current.val = new_val
    
    # 转换为列表(便于查看)
    def to_list(self):
        result = []
        current = self.head
        while current:
            result.append(current.val)
            current = current.next
        return result

# 测试示例
if __name__ == "__main__":
    # 创建链表
    ll = LinkedList()
    ll.create([1, 2, 3])
    print("Initial list:", ll.to_list())  # [1, 2, 3]

    # 头部插入
    ll.prepend(0)
    print("After prepend 0:", ll.to_list())  # [0, 1, 2, 3]

    # 尾部插入
    ll.append(4)
    print("After append 4:", ll.to_list())  # [0, 1, 2, 3, 4]

    # 指定位置插入
    ll.insert(2, 9)
    print("After insert 9 at index 2:", ll.to_list())  # [0, 1, 9, 2, 3, 4]

    # 按值删除
    ll.delete_by_value(9)
    print("After delete value 9:", ll.to_list())  # [0, 1, 2, 3, 4]

    # 按索引删除
    ll.delete_by_index(0)
    print("After delete index 0:", ll.to_list())  # [1, 2, 3, 4]

    # 查找
    print("Search value 3:", ll.search(3))  # True
    print("Search value 9:", ll.search(9))  # False

    # 获取值
    print("Get value at index 2:", ll.get(2))  # 3

    # 修改值
    ll.update(2, 99)
    print("After update index 2 to 99:", ll.to_list())  # [1, 2, 99, 4]

一些简单的题目有leetcode 707、203、82

三、链表排序:

        适合链表的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排 序、基数排序。

        不适合链表的排序算法:希尔排序。主要是由于链表排序智能按顺序访问值。

        可以用于链表排序但不建议使用的排序算法:堆排序。

        

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。