链表:数据结构与算法之链表面试题(高频考点总结)
链表是计算机科学中一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表与数组相比,具有插入和删除操作效率高的特点,但在存储空间和访问速度上存在一定的劣势。本文将围绕链表这一主题,总结一些高频考点的面试题,并给出相应的代码实现。
一、链表的基本概念
1. 节点结构
链表中的每个节点包含两部分:数据和指针。数据部分存储实际的数据值,指针部分指向链表中的下一个节点。
python
class ListNode:
def __init__(self, value=0, next=None):
self.value = value
self.next = next
2. 链表类型
链表可以分为单链表、双向链表和循环链表。
- 单链表:每个节点只有一个指向下一个节点的指针。
- 双向链表:每个节点有两个指针,一个指向前一个节点,一个指向下一个节点。
- 循环链表:最后一个节点的指针指向链表的开头。
二、链表高频面试题
1. 删除链表的倒数第k个节点
题目描述:给定一个链表的头节点 head 和一个整数 k,请删除链表的倒数第 k 个节点,并返回链表的头节点。
思路:使用两个指针,一个快指针 fast 指向第 k 个节点,一个慢指针 slow 指向头节点。当 fast 指针到达第 k 个节点时,slow 指针到达倒数第 k 个节点的前一个节点。然后,将 slow 指针的 next 指针指向 slow 指针的 next.next。
python
def removeNthFromEnd(head, k):
dummy = ListNode(0)
dummy.next = head
fast = slow = dummy
for _ in range(k):
fast = fast.next
while fast.next:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return dummy.next
2. 合并两个有序链表
题目描述:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接两个链表的所有节点组成的。
思路:创建一个哑节点作为新链表的头节点,然后使用两个指针分别遍历两个链表,比较两个链表当前节点的值,将较小的节点添加到新链表中,并移动相应的指针。
python
def mergeTwoLists(l1, l2):
dummy = ListNode(0)
p = dummy
while l1 and l2:
if l1.value < l2.value:
p.next = l1
l1 = l1.next
else:
p.next = l2
l2 = l2.next
p = p.next
p.next = l1 if l1 else l2
return dummy.next
3. 反转链表
题目描述:反转一个单链表。
思路:使用三个指针,pre 指向当前节点的前一个节点,cur 指向当前节点,next 指向当前节点的下一个节点。遍历链表,将当前节点的 next 指针指向 pre,然后移动 pre 和 cur 指针。
python
def reverseList(head):
pre = None
cur = head
while cur:
next = cur.next
cur.next = pre
pre = cur
cur = next
return pre
4. 判断链表是否有环
题目描述:给定一个链表的头节点 head,判断链表中是否存在环。
思路:使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。如果链表中存在环,则快慢指针最终会相遇。
python
def hasCycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
三、总结
链表是数据结构与算法中一个重要的知识点,掌握链表的相关操作对于面试和实际编程都有很大的帮助。本文总结了链表的一些高频面试题,并给出了相应的代码实现。希望读者能够通过阅读本文,加深对链表的理解,提高自己的编程能力。
Comments NOTHING