HJ48 从单向链表中删除指定值的节点

该文章提供了一段Java代码,用于解决从单向链表中删除指定值节点的问题。代码包括两个实现方法,一种是基于官方题解,另一种进行了优化,使其更易理解。程序首先构建链表,然后按给定的值删除节点,并打印出删除后的链表序列。
摘要由CSDN通过智能技术生成

牛客华为机试题库【题号 HJ开头】(重点看)
牛客在线编程算法篇【题号NC开头】
剑指offer【题号 JZ开头】
力扣

1)原题链接

2)已有题解

3)代码

package linklist;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

/**
 * HJ48 从单向链表中删除指定值的节点
 */
public class HJ48DeleteLinkListNote {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while ((str = bf.readLine()) != null) {
            if (str.equals("")) {
                continue;
            }

            // 6 2 1 2 3 2 5 1 4 5 7 2 2
            // 6 {2 [1 2 3 2 5 1 4 5 7 2]} 2
            String[] split = str.split(" ");

            ListNode head = buildListNode(split);

            // 最后一个参数为2,表示要删掉节点为2的值
            int del_number = Integer.parseInt(split[split.length - 1]);

            StringBuilder sb = new StringBuilder();
            ListNode temp = head;
            while (temp != null) {
                if (temp.val != del_number) // 以跳过的方式模拟删除节点
                    sb.append(temp.val).append(" ");
                temp = temp.next;
            }

            System.out.println(sb.toString()); // 注意要求每个数后面都加空格
        }
        bf.close();
    }

    /**
     * HJ48 从单向链表中删除指定值的节点
     * 官方题解的基础上结合了好理解的方式的实现
     */
    private static ListNode buildListNode(String[] split) {
        int noteCounts = Integer.parseInt(split[0]); // 总共有多少个节点

        ListNode head = new ListNode(Integer.parseInt(split[1])); // 头结点

        String[] strings = Arrays.copyOfRange(split, 2, split.length); // 余下的成对的节点

        for (int i = 0; i < noteCounts - 1; i++) { // 头结点为2已确定,6组数据还剩5组,i表示组数
            // 剩下的2个一组表示第2个节点值后面插入第1个节点值
            int willInsert = Integer.parseInt(strings[2 * i]); // 被插入的值
            int afterWho = Integer.parseInt(strings[2 * i + 1]); // 在谁的后面插入值

            ListNode dynamicNode = head; // 临时遍历链表
            while (dynamicNode.val != afterWho) { // 找到插入的位置
                dynamicNode = dynamicNode.next;
            }

            ListNode newNode = new ListNode(willInsert);
            newNode.next = dynamicNode.next; // 插入位置的节点的后序面节点跟踪上
            dynamicNode.next = newNode; // 当前节点挂靠到插入位置的节点上
        }

        return head;
    }

    /**
     * 官方题解
     */
    private static ListNode buildListNode2(String[] split) {
        // 第一个参数6表示输入总共6个节点
        int noteCounts = Integer.parseInt(split[0]); // 总共有多少个节点

        // 第二个参数2表示头节点值为2
        ListNode head = new ListNode(Integer.parseInt(split[1])); // 头结点

        for (int i = 1; i < noteCounts; i++) { // 头结点为2已确定,6组数据所以从第2组开始
            // 剩下的2个一组表示第2个节点值后面插入第1个节点值
            int willInsert = Integer.parseInt(split[2 * i]); // 被插入的值
            int afterWho = Integer.parseInt(split[2 * i + 1]); // 在谁的后面插入值

            ListNode temp = head; // 临时遍历链表
            while (temp.val != afterWho) { // 找到插入的位置
                temp = temp.next;
            }

            ListNode newNode = new ListNode(willInsert);
            newNode.next = temp.next; // 插入位置的节点的后序面节点跟踪上
            temp.next = newNode; // 当前节点挂靠到插入位置的节点上
        }
        return head;
    }


}

/**
 * 单向链表
 */
class ListNode {
    ListNode next;
    int val;

    ListNode(int val) {
        this.val = val;
        next = null;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python,可以通过定义节点类和链表类来实现单向链表的操作。删除指定节点可以通过遍历链表,找到为目标节点,然后连接其前驱节点和后继节点实现节点删除。 具体的实现步骤如下: 1. 定义节点类:节点类需要包含两个属性,一个是节点,另一个是指向下一个节点的指针。同时要定义一个初始化节点的方法。 ```python class Node: def __init__(self, val): self.val = val self.next = None ``` 2. 定义链表类:链表类需要包含至少一个属性,即头节点。其包含插入和删除节点的方法。 ```python class LinkedList: def __init__(self): self.head = None def insert(self, val): node = Node(val) if self.head is None: self.head = node else: node.next = self.head self.head = node def remove(self, val): if self.head is None: return if self.head.val == val: self.head = self.head.next return prev = self.head curr = self.head.next while curr is not None: if curr.val == val: prev.next = curr.next return prev = curr curr = curr.next ``` 3. 删除指定节点:在链表实现remove方法,遍历链表,找到为目标节点,然后连接其前驱节点和后继节点实现节点删除。 具体如上面代码所示,当链表为空或者头节点等于目标时,可以直接删除节点。否则需要遍历链表,找到目标节点的前驱节点和后继节点,然后连接前驱节点和后继节点即可。 这就是Python单向链表删除指定节点实现方式,可以应用于一些需要动态更新数据结构的场景
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值