返回

链表小技巧让编码如虎添翼:助你征服算法面试!

前端

链表是数据结构里一个很基础但是又很爱考的线性结构,链表的操作相对来说比较简单,但是非常适合考察面试者写代码的能力,以及对 corner case 的处理,还有指针的应用很容易引起 NPE (null pointer exception),所以我这里总结了几个小技巧,希望能够帮助大家更好的掌握链表。

  1. 使用哑结点来简化链表操作

哑结点是一个特殊的结点,它不存储任何数据,它的作用是简化链表操作。比如,在添加新结点时,如果我们使用哑结点,就不需要考虑边界情况。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

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

    def add_node(self, data):
        new_node = Node(data)
        new_node.next = self.head.next
        self.head.next = new_node
  1. 使用双指针来遍历链表

双指针是链表中的一种常见操作。双指针可以用来遍历链表,也可以用来查找链表中的元素。

def find_element(head, target):
    slow = head
    fast = head
    while fast is not None and fast.next is not None:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            return True
    return False
  1. 使用递归来遍历链表

递归是链表中的一种常见操作。递归可以用来遍历链表,也可以用来查找链表中的元素。

def find_element_recursive(head, target):
    if head is None:
        return False
    if head.data == target:
        return True
    return find_element_recursive(head.next, target)
  1. 使用迭代来遍历链表

迭代是链表中的一种常见操作。迭代可以用来遍历链表,也可以用来查找链表中的元素。

def find_element_iterative(head, target):
    while head is not None:
        if head.data == target:
            return True
        head = head.next
    return False
  1. 使用栈来实现链表

栈是一种数据结构,它遵循后进先出的原则。栈可以用来实现链表。

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

class LinkedList:
    def __init__(self):
        self.stack = Stack()

    def add_node(self, data):
        self.stack.push(data)

    def get_node(self):
        return self.stack.pop()
  1. 使用队列来实现链表

队列是一种数据结构,它遵循先进先出的原则。队列可以用来实现链表。

class Queue:
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.append(item)

    def dequeue(self):
        return self.items.pop(0)

class LinkedList:
    def __init__(self):
        self.queue = Queue()

    def add_node(self, data):
        self.queue.enqueue(data)

    def get_node(self):
        return self.queue.dequeue()
  1. 使用哈希表来实现链表

哈希表是一种数据结构,它可以根据键快速找到对应的值。哈希表可以用来实现链表。

class HashTable:
    def __init__(self):
        self.table = {}

    def put(self, key, value):
        self.table[key] = value

    def get(self, key):
        return self.table.get(key)

class LinkedList:
    def __init__(self):
        self.hash_table = HashTable()

    def add_node(self, data):
        self.hash_table.put(data, None)

    def get_node(self, data):
        return self.hash_table.get(data)
  1. 使用二叉树来实现链表

二叉树是一种数据结构,它可以用来存储数据。二叉树可以用来实现链表。

class Node:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

class BinaryTree:
    def __init__(self):
        self.root = None

    def add_node(self, data):
        new_node = Node(data)
        if self.root is None:
            self.root = new_node
        else:
            self.insert_node(new_node, self.root)

    def insert_node(self, new_node, current_node):
        if new_node.data < current_node.data:
            if current_node.left is None:
                current_node.left = new_node
            else:
                self.insert_node(new_node, current_node.left)
        else:
            if current_node.right is None:
                current_node.right = new_node
            else:
                self.insert_node(new_node, current_node.right)

    def get_node(self, data):
        return self.find_node(data, self.root)

    def find_node(self, data, current_node):
        if current_node is None:
            return None
        if current_node.data == data:
            return current_node
        elif data < current_node.data:
            return self.find_node(data, current_node.left)
        else:
            return self.find_node(data, current_node.right)

class LinkedList:
    def __init__(self):
        self.binary_tree = BinaryTree()

    def add_node(self, data):
        self.binary_tree.add_node(data)

    def get_node(self, data):
        return self.binary_tree.get_node(data)