链表-----1.删除链表中的结点

这篇博客介绍了如何在链表中删除给定的非末尾节点,提供了详细的解题思路和代码实现,旨在解决LeetCode上的相关问题。示例展示了如何处理不同情况,确保节点正确删除。
摘要由CSDN通过智能技术生成

第14日:删除链表中的结点

题目链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnarn7/

题目:

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点

现有一个链表 – head = [4,5,1,9],它可以表示为:

img

示例 1

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

提示

  • 链表至少包含两个节点。
  • 链表中所有节点的值都是唯一的。
  • 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
  • 不要从你的函数中返回任何结果。

相关标签 链表

解题:

  1. next重新指向

    大致思路:

    首先注意题意,已经给出了要删除的结点,这个形参是就是要删除的结点。

    将当前结点的值等于下一个结点,并将next指向下下一个结点。

    详细代码如下:

        public void deleteNode(ListNode node) {
            node.val=node.next.val;
            node.next=node.next.next;
        }
    

    image-20211006093549862

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ```c++ ListNode* getIthNode(ListNode* head, int i) { int count = 1; ListNode* p = head; while (p && count != i) { p = p->next; count++; } return p; } ``` ### 回答2: 首先,在函数的输入参数需要包含链表的头节点指针和要查找的第i个节点的索引i。 算法如下: 1. 如果传入的头节点指针为空,则链表为空,直接返回NULL。 2. 初始化一个指针p为头节点。 3. 用一个整数count来记录当前遍历到的节点的索引,初始值为1。 4. 进入循环,在循环判断两个条件:当前count等于传入的i,或者p指针为空。 a. 如果当前count等于传入的i,则找到第i个节点,返回p指针。 b. 如果p指针为空,则链表不存在第i个节点,返回NULL。 5. 若以上条件均不满足,则继续遍历下一个节点。 a. 将p指针移向下一个节点,即p = p->next。 b. 将count加1,即count++。 6. 重复步骤4-5,直到找到第i个节点或者链表遍历结束。 最后,如果循环结束也没有找到第i个节点,则返回NULL。 以下是算法的C代码实现: ```c #include <stdio.h> #include <stdlib.h> //链表节点结构体定义 struct ListNode { int data; struct ListNode* next; }; struct ListNode* findNode(struct ListNode* head, int i) { if (head == NULL) { return NULL; } struct ListNode* p = head; int count = 1; while (count != i && p != NULL) { p = p->next; count++; } if (count == i) { return p; } else { return NULL; } } int main() { // 创建链表 struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode)); struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode)); head->data = 1; head->next = node1; node1->data = 2; node1->next = node2; node2->data = 3; node2->next = node3; node3->data = 4; node3->next = NULL; // 查找第2个节点 struct ListNode* result = findNode(head, 2); if (result == NULL) { printf("不存在第2个节点\n"); } else { printf("第2个节点的数据为:%d\n", result->data); } free(head); free(node1); free(node2); free(node3); return 0; } ``` 以上代码,我创建了一个简单的链表,其有四个节点,然后我调用`findNode`函数去查找第二个节点,并打印出结果。 ### 回答3: 可以使用以下算法来求解链表第i个结点的指针: 1. 首先,定义一个指针变量p指向链表的头结点。 2. 定义一个变量count并初始化为1,用来计数当前遍历到的结点位置。 3. 通过循环遍历链表,当count小于i时,继续遍历链表,让p指向下一个结点,并将计数器count加1。当count等于i时,表示找到了第i个结点,此时返回p指针。 4. 若循环结束时仍然没有找到第i个结点,则返回NULL。 以下是用C++实现上述算法的示例代码: ``` struct ListNode { int val; ListNode* next; }; ListNode* getNthNode(ListNode* head, int i) { ListNode* p = head; int count = 1; while (p && count < i) { p = p->next; count++; } if (count == i) { return p; } else { return NULL; } } ``` 该算法的时间复杂度为O(i),其i表示要求的结点位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值