如何删除链表的中间节点和a/b处的节点?


在链表中删除中间节点或者特定位置(如 a/b 处)的节点涉及到一些基本的链表操作。下面我将分别解释这两种情况下的处理方法。

删除中间节点

假设“中间节点”是指链表从头到尾节点数量的中间位置。对于长度为偶数或奇数的链表,中间节点的位置可能略有不同。以下是删除中间节点的基本步骤:

  1. 确定中间节点的位置

    • 可以使用快慢指针技术来找到中间节点。快指针每次移动两步,慢指针每次移动一步,当快指针到达链表尾部时,慢指针就在中间位置。
  2. 删除中间节点

    • 当找到了中间节点后,需要调整指针以跳过该节点。如果是单链表,需要让前一个节点指向当前中间节点的下一个节点。
    • 如果是双链表,则只需要调整当前节点的前后指针即可。

删除 a/b 处的节点

删除 a/b 处的节点意味着要删除从头部开始的第 a/b * 链表长度 的节点。这里的 a 和 b 是整数,并且 a < b。具体操作如下:

  1. 计算 a/b 处的位置

    • 首先遍历整个链表来获取链表的长度 N。
    • 计算目标节点的位置 pos = ceil((a / b) * N),这里 ceil 表示向上取整。
  2. 删除指定位置的节点

    • 再次遍历链表直到 pos-1 位置,这里的 pos 是计算得到的位置。
    • 调整 pos-1 位置节点的 next 指针,使其指向 pos+1 位置的节点,从而跳过 pos 位置的节点。

注意:在实际编程中,你需要考虑边界条件,比如链表为空的情况,或者 a/b 导致的位置超出链表范围等。
以上描述的是算法上的逻辑,具体的实现会依赖于使用的编程语言和链表的具体实现方式

示例

接下来我会提供一些伪代码示例来帮助理解如何实现上述两种情况。请注意,这些示例将基于单向链表进行说明。

定义链表节点结构

首先定义一个简单的链表节点结构:

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next
删除中间节点

假设我们已经有一个链表 head,我们将使用快慢指针的方法来找到中间节点并删除它:

def delete_middle_node(head):
    if not head or not head.next:
        return None
    
    slow = head
    fast = head
    prev = None
    
    # 使用快慢指针找到中间节点
    while fast and fast.next:
        fast = fast.next.next
        prev = slow
        slow = slow.next
    
    # 删除中间节点
    if prev:
        prev.next = slow.next
    else:  # 如果中间节点是头节点
        head = slow.next
    
    return head
删除 a/b 处的节点

为了删除 a/b 处的节点,我们需要首先计算出确切的位置,然后找到该位置的前一个节点,并进行删除操作:

def delete_node_at_position(head, a, b):
    if not head or not head.next:
        return None
    
    length = 0
    temp = head
    
    # 计算链表的长度
    while temp:
        length += 1
        temp = temp.next
    
    # 计算目标位置
    target_pos = int((a / b) * length)
    
    # 特殊情况处理
    if target_pos == 0:
        return head.next
    
    current = head
    count = 0
    
    # 找到目标节点的前一个节点
    while current and count < target_pos - 1:
        current = current.next
        count += 1
    
    if current and current.next:
        current.next = current.next.next
    
    return head

注意事项

  • 这些函数返回了修改后的链表头节点。
  • 在实际应用中,你可能需要根据具体需求调整边界条件处理。
  • delete_node_at_position 函数假设 ab 是有效的输入,即 a 总是小于 b,并且 a / b 不会超过链表长度的比例。

Python 实现案例

下面是具体的 Python 实现案例,包括创建链表、删除中间节点以及删除 a/b 处节点的完整代码示例。

创建链表

首先,我们需要定义链表节点类,并编写一个函数来创建一个链表:

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

def create_linked_list(values):
    dummy_head = ListNode()
    current = dummy_head
    for value in values:
        current.next = ListNode(value)
        current = current.next
    return dummy_head.next

删除中间节点

接下来,我们实现删除中间节点的功能:

def delete_middle_node(head):
    if not head or not head.next:
        return None
    
    slow = head
    fast = head
    prev = None
    
    # 使用快慢指针找到中间节点
    while fast and fast.next:
        fast = fast.next.next
        prev = slow
        slow = slow.next
    
    # 删除中间节点
    if prev:
        prev.next = slow.next
    else:  # 如果中间节点是头节点
        head = slow.next
    
    return head

删除 a/b 处的节点

然后,实现删除 a/b 处节点的功能:

def delete_node_at_position(head, a, b):
    if not head or not head.next:
        return None
    
    length = 0
    temp = head
    
    # 计算链表的长度
    while temp:
        length += 1
        temp = temp.next
    
    # 计算目标位置
    target_pos = int((a / b) * length)
    
    # 特殊情况处理
    if target_pos == 0:
        return head.next
    
    current = head
    count = 0
    
    # 找到目标节点的前一个节点
    while current and count < target_pos - 1:
        current = current.next
        count += 1
    
    if current and current.next:
        current.next = current.next.next
    
    return head

测试代码

最后,我们编写一个测试函数来验证这些功能:

def print_linked_list(head):
    current = head
    while current:
        print(current.value, end=" -> ")
        current = current.next
    print("None")

# 创建一个示例链表
values = [1, 2, 3, 4, 5]
linked_list = create_linked_list(values)

print("Original Linked List:")
print_linked_list(linked_list)

# 删除中间节点
linked_list = delete_middle_node(linked_list)
print("Linked List after deleting middle node:")
print_linked_list(linked_list)

# 删除 a/b 处的节点 (例如 a=1, b=2)
linked_list = delete_node_at_position(linked_list, 1, 2)
print("Linked List after deleting node at position 1/2:")
print_linked_list(linked_list)

这段代码将会创建一个包含 [1, 2, 3, 4, 5] 的链表,并演示如何删除中间节点以及删除 a/b 处的节点。你可以根据自己的需要调整 values 列表以及 ab 的值来进行测试。

让我们继续通过具体的例子来测试删除中间节点和 a/b 处节点的功能。

示例代码完整版

以下是完整的 Python 代码示例,包括创建链表、删除中间节点、删除 a/b 处节点以及测试用例:

class ListNode:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next

def create_linked_list(values):
    dummy_head = ListNode()
    current = dummy_head
    for value in values:
        current.next = ListNode(value)
        current = current.next
    return dummy_head.next

def delete_middle_node(head):
    if not head or not head.next:
        return None
    
    slow = head
    fast = head
    prev = None
    
    # 使用快慢指针找到中间节点
    while fast and fast.next:
        fast = fast.next.next
        prev = slow
        slow = slow.next
    
    # 删除中间节点
    if prev:
        prev.next = slow.next
    else:  # 如果中间节点是头节点
        head = slow.next
    
    return head

def delete_node_at_position(head, a, b):
    if not head or not head.next:
        return None
    
    length = 0
    temp = head
    
    # 计算链表的长度
    while temp:
        length += 1
        temp = temp.next
    
    # 计算目标位置
    target_pos = int((a / b) * length)
    
    # 特殊情况处理
    if target_pos == 0:
        return head.next
    
    current = head
    count = 0
    
    # 找到目标节点的前一个节点
    while current and count < target_pos - 1:
        current = current.next
        count += 1
    
    if current and current.next:
        current.next = current.next.next
    
    return head

def print_linked_list(head):
    current = head
    while current:
        print(current.value, end=" -> ")
        current = current.next
    print("None")

# 创建一个示例链表
values = [1, 2, 3, 4, 5]
linked_list = create_linked_list(values)

print("Original Linked List:")
print_linked_list(linked_list)

# 删除中间节点
linked_list = delete_middle_node(linked_list)
print("Linked List after deleting middle node:")
print_linked_list(linked_list)

# 删除 a/b 处的节点 (例如 a=1, b=2)
linked_list = delete_node_at_position(linked_list, 1, 2)
print("Linked List after deleting node at position 1/2:")
print_linked_list(linked_list)

测试输出

这段代码的预期输出如下:

Original Linked List:
1 -> 2 -> 3 -> 4 -> 5 -> None
Linked List after deleting middle node:
1 -> 2 -> 4 -> 5 -> None
Linked List after deleting node at position 1/2:
1 -> 4 -> 5 -> None

在这个例子中:

  1. 原始链表为 [1, 2, 3, 4, 5]
  2. 删除中间节点(3),链表变为 [1, 2, 4, 5]
  3. 删除 a/b 处的节点(即 a=1, b=2 时,目标位置为 (1/2) * 4 = 2),删除第二个节点(2),链表变为 [1, 4, 5]

你可以根据需要调整 values 列表中的值以及 ab 的值来测试不同的情况。

😍😍 海量H5小游戏、微信小游戏、Web casualgame源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极致人生-010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值