返回
链表小技巧让编码如虎添翼:助你征服算法面试!
前端
2024-01-27 02:59:36
链表是数据结构里一个很基础但是又很爱考的线性结构,链表的操作相对来说比较简单,但是非常适合考察面试者写代码的能力,以及对 corner case 的处理,还有指针的应用很容易引起 NPE (null pointer exception),所以我这里总结了几个小技巧,希望能够帮助大家更好的掌握链表。
- 使用哑结点来简化链表操作
哑结点是一个特殊的结点,它不存储任何数据,它的作用是简化链表操作。比如,在添加新结点时,如果我们使用哑结点,就不需要考虑边界情况。
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
- 使用双指针来遍历链表
双指针是链表中的一种常见操作。双指针可以用来遍历链表,也可以用来查找链表中的元素。
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
- 使用递归来遍历链表
递归是链表中的一种常见操作。递归可以用来遍历链表,也可以用来查找链表中的元素。
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)
- 使用迭代来遍历链表
迭代是链表中的一种常见操作。迭代可以用来遍历链表,也可以用来查找链表中的元素。
def find_element_iterative(head, target):
while head is not None:
if head.data == target:
return True
head = head.next
return False
- 使用栈来实现链表
栈是一种数据结构,它遵循后进先出的原则。栈可以用来实现链表。
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()
- 使用队列来实现链表
队列是一种数据结构,它遵循先进先出的原则。队列可以用来实现链表。
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()
- 使用哈希表来实现链表
哈希表是一种数据结构,它可以根据键快速找到对应的值。哈希表可以用来实现链表。
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)
- 使用二叉树来实现链表
二叉树是一种数据结构,它可以用来存储数据。二叉树可以用来实现链表。
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)