返回

深层次剖析链表算法,助力面试满分!

Android

导言

链表因其灵活性、适应性和代码简洁性而成为面试中常见的考察对象。本文旨在深入剖析链表相关算法,提供清晰易懂的步骤和实用范例,帮助您在面试中游刃有余。

算法详解

1. 栈法求链表逆序

  • 原理:利用栈先进后出的特点,将链表元素依次压入栈中,再依次出栈即可得到逆序链表。
def reverse_list_stack(head):
    stack = []
    while head:
        stack.append(head.val)
        head = head.next
    
    dummy = ListNode(-1)
    curr = dummy
    while stack:
        curr.next = ListNode(stack.pop())
        curr = curr.next
    
    return dummy.next

2. 头插法求链表逆序

  • 原理:从链表尾部开始,逐个将元素插入链表头部。
def reverse_list_head_insert(head):
    dummy = ListNode(-1)
    while head:
        next_node = head.next
        head.next = dummy.next
        dummy.next = head
        head = next_node
    
    return dummy.next

3. 递归法求链表逆序

  • 原理:递归到底后,链表自然逆序。
def reverse_list_recursive(head):
    if not head or not head.next:
        return head
    
    new_head = reverse_list_recursive(head.next)
    head.next.next = head
    head.next = None
    
    return new_head

4. 快慢指针法求链表中间节点

  • 原理:使用两个指针,一个每次走一步,另一个每次走两步。当快指针走到链表末尾时,慢指针刚好走到链表中间。
def find_middle_node(head):
    slow = fast = head
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next
    
    return slow

5. 遍历链表求倒数第 k 个节点

  • 原理:先遍历链表一遍,得到链表长度 n。再从头开始遍历 n - k 次,即可得到倒数第 k 个节点。
def find_kth_from_end(head, k):
    dummy = ListNode(-1)
    dummy.next = head
    
    # 遍历一遍,获取链表长度
    n = 0
    curr = dummy.next
    while curr:
        n += 1
        curr = curr.next
    
    # 再从头开始遍历 n - k 次
    curr = dummy.next
    for _ in range(n - k):
        curr = curr.next
    
    return curr

结语

熟练掌握这些链表算法,将为您的面试之旅增添一份信心和底气。持续深入探索数据结构和算法,不断精进自己的编程技能,在面试中脱颖而出,铸就职场辉煌。