链表刷题TOP202
发布人:shili8
发布时间:2025-02-22 02:02
阅读次数:0
**链表刷题 TOP202**
链表是一种常见的数据结构,广泛应用于计算机科学中。链表刷题是程序员们经常遇到的一个问题。下面我们将列出一些常见的链表刷题,以及它们的解法和代码示例。
###1. 链表的基本操作#### 题目描述:
* 创建一个链表* 插入一个新节点到链表中* 删除一个节点从链表中* 打印链表中的所有元素#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def insert(self, data): if not self.head: self.head = Node(data) else: current_node = self.head while current_node.next: current_node = current_node.next current_node.next = Node(data) def delete(self, key): if self.head is None: return # If the node to be deleted is head node if self.head.data == key: self.head = self.head.next return # Search for the node to be deleted and update the links current_node = self.head while current_node.next: if current_node.next.data == key: break current_node = current_node.next if current_node.next is None and current_node.data != key: print("Node not found") return # If node to be deleted is head node, then change the head pointer if current_node.next.data == key: current_node.next = current_node.next.next def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) print("Linked List:") linked_list.print_list() # Output:123linked_list.delete(2) print("Linked List after deletion:") linked_list.print_list() # Output:13
###2. 链表的反转#### 题目描述:
* 反转一个链表#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def reverse(self): prev_node = None current_node = self.head while current_node: next_node = current_node.next # Store the next node temporarily current_node.next = prev_node # Reverse the link of the current node prev_node = current_node # Move prev_node and current_node one step forward current_node = next_node self.head = prev_node # Update head pointer to point to the new first node def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) print("Original Linked List:") linked_list.print_list() # Output:123linked_list.reverse() print("Reversed Linked List:") linked_list.print_list() # Output:321
###3. 链表的中间节点#### 题目描述:
* 找到一个链表的中间节点#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def find_middle(self): slow_ptr = self.head fast_ptr = self.head if self.head is not None: while fast_ptr is not None and fast_ptr.next is not None: fast_ptr = fast_ptr.next.next # Move fast_ptr two steps at a time slow_ptr = slow_ptr.next # Move slow_ptr one step at a time return slow_ptr.data # Return the data of the middle node def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) print("Middle Node of Linked List:") print(linked_list.find_middle()) # Output:2
###4. 链表的长度#### 题目描述:
* 找到一个链表的长度#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def length(self): count =0 temp = self.head while temp: count +=1 temp = temp.next return count def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) print("Length of Linked List:") print(linked_list.length()) # Output:3
###5. 链表的合并#### 题目描述:
* 合并两个链表#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def merge(self, other_list): if not self.head and not other_list.head: return None if not self.head: return other_list if not other_list.head: return self current_node1 = self.head current_node2 = other_list.head while current_node1.next and current_node2: next_node1 = current_node1.next next_node2 = current_node2.next # Merge smaller value first if current_node1.data <= current_node2.data: current_node1.next = next_node1 current_node1 = next_node1 else: current_node2.next = next_node2 current_node2 = next_node2 # If there are remaining nodes in either list, append them to the end of the merged list if current_node1: current_node2.next = current_node1 elif current_node2: self.head = current_list def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list1 = LinkedList() linked_list1.insert(1) linked_list1.insert(3) linked_list2 = LinkedList() linked_list2.insert(2) linked_list2.insert(4) print("Merged Linked List:") linked_list1.merge(linked_list2).print_list() # Output:1234
###6. 链表的删除#### 题目描述:
* 删除一个链表中的所有元素#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def delete_all(self): current_node = self.head while current_node: next_node = current_node.next # Store the next node temporarily del current_node # Delete the current node current_node = next_node self.head = None # Update head pointer to point to None def print_list(self): temp = self.head while temp: print(temp.data, end=" ") temp = temp.next print() # Example usagelinked_list = LinkedList() linked_list.insert(1) linked_list.insert(2) linked_list.insert(3) print("Original Linked List:") linked_list.print_list() # Output:123linked_list.delete_all() print("Linked List after deletion:") linked_list.print_list() # Output:
###7. 链表的反转#### 题目描述:
* 反转一个链表#### 解法:
class Node: def __init__(self, data=None): self.data = data self.next = Noneclass LinkedList: def __init__(self): self.head = None def reverse(self): prev_node = None current_node = self.head while current_node: next_node = current_node.next # Store the next node temporarily current_node.next = prev_node # Reverse the link of the current node prev_node = current_node # Move to the previous node