返回

力破常规:突破面试难题的巧思妙解

前端

乍看之下,一道只含一个节点且无头节点的链表删除中间节点题目,似乎无从下手。然而,细细思量,解题思路便会豁然开朗。

思路一:化繁为简,巧妙替换

面对无头节点的窘境,我们不妨跳出常规思维,从节点本身入手。将下一个节点的值赋予当前节点,再将下一个节点的下一个节点赋予当前节点的下一个节点,这样一来,中间节点就悄然消失了,链表结构得以保留。

思路二:借力打力,无中生有

既然题目没有提供头节点,我们何不自行创建?通过引入一个虚拟头节点,将原链表与虚拟头节点相连,此时链表便有了头尾之分。利用头节点的优势,我们可以轻松定位中间节点,并进行删除操作。

实践出真知,代码验证

# 定义链表节点
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

# 思路一:直接替换
def delete_middle_node1(node):
    if not node or not node.next:
        return

    # 将下一个节点的值赋予当前节点
    node.data = node.next.data

    # 将下一个节点的下一个节点赋予当前节点的下一个节点
    node.next = node.next.next

# 思路二:引入虚拟头节点
def delete_middle_node2(node):
    # 创建虚拟头节点
    dummy = Node(0)
    dummy.next = node

    # 遍历链表,找到中间节点的前驱节点
    prev = dummy
    while prev.next and prev.next.next:
        prev = prev.next

    # 删除中间节点
    prev.next = prev.next.next

# 测试代码
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)
node1.next = node2
node2.next = node3

# 调用两种方法删除中间节点
delete_middle_node1(node2)
delete_middle_node2(node2)

# 输出修改后的链表
node = node1
while node:
    print(node.data, end=' ')
    node = node.next

结语

解题之道千变万化,灵活应变方能破题而出。面对面试中的难题,切忌拘泥于常规思路,不妨跳出框架,从不同角度审视问题,用新奇的解题方式展现自己的思维广度和解决问题的能力。唯有如此,才能在竞争激烈的面试中脱颖而出,为自己赢得更多的机会。