【华为机试048】从单向链表中删除指定值的结点

题目描述:

输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。

链表结点定义如下:

struct ListNode

{

int       m_nKey;

ListNode* m_pNext;

};

详细描述:

本题为考察链表的插入和删除知识。

链表的值不能重复

构造过程,例如

1 <- 2

3 <- 2

5 <- 1

4 <- 5

7 <- 2

最后的链表的顺序为 2 7 3 1 5 4

删除 结点 2

则结果为 7 3 1 5 4

Java实现:

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int head = sc.nextInt();
            LinkedList<Integer> linkedList = new LinkedList<Integer>();
            linkedList.add(head);
            for (int i = 0; i < n-1; i++) {
                Integer next = sc.nextInt();
                Integer parent = sc.nextInt();
                int index = linkedList.indexOf(parent);
                linkedList.add(index+1, next);
            }
            Integer remove = sc.nextInt();
            linkedList.remove(remove);

            int i;
            for (i = 0; i < linkedList.size()-1; i++) {
                System.out.print(linkedList.get(i)+" ");
            }
            System.out.print(linkedList.get(i)+" ");
            System.out.println();
        }
    }


}


关键点:

  • 是linkedList.add(index+1, next)而不是linkedList.add(index+1, next),新插入值的索引是给出值的索引的下一个位置
华为OD场景下,使用C++从单向链表删除指定节点,可按以下步骤实现。首先定义链表节点的结构体,然后实现删除指定节点的函数。 ```cpp #include <iostream> // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 删除指定节点的函数 ListNode* deleteNode(ListNode* head, int target) { // 处理头节点就是目标节点的情况 while (head && head->val == target) { ListNode* temp = head; head = head->next; delete temp; } ListNode* current = head; while (current && current->next) { if (current->next->val == target) { ListNode* temp = current->next; current->next = current->next->next; delete temp; } else { current = current->next; } } return head; } // 辅助函数:打印链表 void printList(ListNode* head) { ListNode* current = head; while (current) { std::cout << current->val << " "; current = current->next; } std::cout << std::endl; } int main() { // 创建链表 1 -> 2 -> 3 -> 2 -> 4 ListNode* head = new ListNode(1); head->next = new ListNode(2); head->next->next = new ListNode(3); head->next->next->next = new ListNode(2); head->next->next->next->next = new ListNode(4); std::cout << "Original list: "; printList(head); // 删除为 2 的节点 head = deleteNode(head, 2); std::cout << "List after deletion: "; printList(head); // 释放链表内存 while (head) { ListNode* temp = head; head = head->next; delete temp; } return 0; } ``` 在上述代码中,`ListNode`结构体用于表示链表的节点,包含节点的`val`和指向下一个节点的指针`next`。`deleteNode`函数用于删除链表为`target`的节点。首先处理头节点就是目标节点的情况,然后遍历链表,若当前节点的下一个节点是目标节点,则删除该节点。`printList`函数用于打印链表的元素。在`main`函数中,创建了一个示例链表,调用`deleteNode`函数删除指定节点,并打印删除前后的链表,最后释放链表占用的内存。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值