返回

LeetCode题解 - LinkedList | 探索链表数据结构的奥秘

后端

链表:算法和数据结构中的基本工具

链表是一种简单但强大的数据结构,在算法和数据结构中扮演着至关重要的角色。它由一系列称为节点的元素组成,每个节点包含一个数据项和指向下一个节点的指针。这种灵活性使得链表非常适合处理动态数据,因为可以轻松地插入、删除和修改元素。

链表操作:插入、删除、查找和修改

在链表中进行这些操作至关重要:

  • 插入: 将元素添加到链表的头部、尾部或指定位置。
  • 删除: 从链表的头部、尾部或指定位置删除元素。
  • 查找: 在链表中搜索特定元素。
  • 修改: 修改链表中元素的数据项。
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def insert_at_head(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def insert_at_tail(self, data):
        new_node = Node(data)
        if self.head is None:
            self.head = new_node
        else:
            current_node = self.head
            while current_node.next is not None:
                current_node = current_node.next
            current_node.next = new_node

    def insert_at_index(self, index, data):
        new_node = Node(data)
        if index == 0:
            self.insert_at_head(data)
        else:
            current_node = self.head
            for i in range(index - 1):
                current_node = current_node.next
            new_node.next = current_node.next
            current_node.next = new_node

    def delete_at_head(self):
        if self.head is None:
            return
        self.head = self.head.next

    def delete_at_tail(self):
        if self.head is None:
            return
        current_node = self.head
        while current_node.next.next is not None:
            current_node = current_node.next
        current_node.next = None

    def delete_at_index(self, index):
        if index == 0:
            self.delete_at_head()
        else:
            current_node = self.head
            for i in range(index - 1):
                current_node = current_node.next
            current_node.next = current_node.next.next

    def find(self, data):
        current_node = self.head
        while current_node is not None:
            if current_node.data == data:
                return current_node
            current_node = current_node.next
        return None

    def modify(self, index, data):
        if index == 0:
            self.head.data = data
        else:
            current_node = self.head
            for i in range(index):
                current_node = current_node.next
            current_node.data = data

    def print_list(self):
        current_node = self.head
        while current_node is not None:
            print(current_node.data, end=" ")
            current_node = current_node.next

链表遍历:从头到尾

遍历链表涉及从链表的头部开始,依次访问每个节点,直到到达尾部。这对于获取链表中所有元素或执行其他操作非常有用。

def traverse_list(head):
    current_node = head
    while current_node is not None:
        print(current_node.data)
        current_node = current_node.next

链表排序:快速有效

链表排序需要将链表中的元素按一定顺序排列。常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序和快速排序。

def sort_list(head):
    if head is None or head.next is None:
        return head

    current_node = head
    previous_node = None

    while current_node is not None:
        next_node = current_node.next
        if previous_node is None or current_node.data >= previous_node.data:
            previous_node = current_node
        else:
            current_node.next = previous_node
            previous_node = current_node
        current_node = next_node

    return previous_node

链表反转:颠倒乾坤

链表反转将链表中的元素顺序颠倒。从尾部开始,将每个节点移动到链表的头部,直到完成。

def reverse_list(head):
    previous_node = None
    current_node = head

    while current_node is not None:
        next_node = current_node.next
        current_node.next = previous_node
        previous_node = current_node
        current_node = next_node

    return previous_node

链表循环:环状结构

循环链表是指链表中某个节点指向之前访问过的节点,形成一个闭合环路。检测循环链表非常重要,因为它可以帮助解决链表中的错误或异常。

def detect_cycle(head):
    slow_ptr = head
    fast_ptr = head

    while slow_ptr is not None and fast_ptr is not None and fast_ptr.next is not None:
        slow_ptr = slow_ptr.next
        fast_ptr = fast_ptr.next.next

        if slow_ptr == fast_ptr:
            return True

    return False

链表合并:两个合一

链表合并将两个有序链表合并成一个新的有序链表。合并后的链表依然保持有序性。

def merge_lists(l1, l2):
    dummy_head = Node(None)
    current_node = dummy_head

    while l1 is not None and l2 is not None:
        if l1.data < l2.data:
            current_node.next = l1
            l1 = l1.next
        else:
            current_node.next = l2
            l2 = l2.next
        current_node = current_node.next

    while l1 is not None:
        current_node.next = l1
        l1 = l1.next
        current_node = current_node.next

    while l2 is not None:
        current_node.next = l2
        l2 = l2.next
        current_node = current_node.next

    return dummy_head.next

链表交叉:殊途同归

链表交叉是指在两个链表中存在一个公共节点,即两个链表在某个位置开始共享相同的节点。检测链表交叉可以帮助解决两个链表之间是否存在交集的问题。

def detect_intersection(l1, l2):
    len1 = get_length(l1)
    len2 = get_length(l2)

    if len1 > len2:
        l1 = skip_nodes(l1, len1 - len2)
    elif len2 > len1:
        l2 = skip_nodes(l2, len2 - len1)

    while l1 is not None and l2 is not None:
        if l1 == l2:
            return l1
        l1 = l1.next
        l2 = l2.next

    return None

def get_length(head):
    count = 0
    while head is not None:
        count += 1
        head = head.next
    return count

def skip_nodes(head, n):
    while n > 0:
        head = head.next
        n -= 1
    return head

链表进阶:探索更多奥秘

链表最长公共子序列:取长补短

链表最长公共子序列是指在两个链表中找到最长的公共子序列,即两个链表中出现顺序相同且不重复的元素序列。

链表最短路径:寻径捷径

链表最短路径是指在链表中找到从起点到终点的最短路径,常用于解决路径规划和图论问题。

链表深度拷贝:一模一样

链表深度拷贝是指创建一个链表的新副本,新副本与原链表拥有相同的数据和结构,但它们在内存中是独立的。

链表克隆:复制镜像

链表克隆是指创建一个链表的新副本,新副本与原链表拥有相同的数据和结构,但它们在内存中是完全独立的。

链表拷贝:浅层复制

链表拷贝是指