数据结构与算法之链表 链表面试题 高频考点总结

数据结构与算法阿木 发布于 9 天前 1 次阅读


链表:数据结构与算法之链表面试题(高频考点总结)

链表是计算机科学中一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表与数组相比,具有插入和删除操作效率高的特点,但在存储空间和访问速度上存在一定的劣势。本文将围绕链表这一主题,总结一些高频考点的面试题,并给出相应的代码实现。

一、链表的基本概念

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


三、总结

链表是数据结构与算法中一个重要的知识点,掌握链表的相关操作对于面试和实际编程都有很大的帮助。本文总结了链表的一些高频面试题,并给出了相应的代码实现。希望读者能够通过阅读本文,加深对链表的理解,提高自己的编程能力。