-
2022-01-26 22:35:12
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意:此题对比原题有改动
示例 1:
输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.说明:
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
分析:
方法:双指针
定义两个指针,一个指向当前节点,一个指向上一个节点,当遍历到需要删除的节点时,就将上一个节点的指针指向当前节点的下一个节点。需要注意的是:如果删除的是第一个节点,那么直接返回当前节点的下一个节点即可。
时间复杂度:O(n)
空间复杂度:O(1)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode deleteNode(ListNode head, int val) { //需要删除节点是头节点时 if(head.val == val){ return head.next; } //定义双指针 ListNode cur = head, pre = head; while(cur != null){ //找到删除点,将上一个节点指向下一个节点 if(cur.val == val){ pre.next = cur.next; break; } //记录当前节点 pre = cur; //遍历下一个节点 cur = cur.next; } return head; } }
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof更多相关内容 -
算法:删除链表节点
2022-03-17 20:52:49请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 示例 1: 输入:head = [4,5,1,9], node = ...237. 删除链表中的节点
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点
head
,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点示例 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示例 3:
输入:head = [1,2,3,4], node = 3
输出:[1,2,4]示例 4:
输入:head = [0,1], node = 0
输出:[1]示例 5:
输入:head = [-3,5,-99], node = -3
输出:[5,-99]来源:力扣(LeetCode)
解题思路1
常见
删除
方法是将定位到要删除节点的上一个节点
,将上一个节点的next 指针
直接指向要删除节点的下一个节点
但在此题中
- 我们无法取得要删除节点的上一个节点
- 我们无法访问链表头结点
- 要删除的节点不是末尾结点
所以我们可以作弊一下,通过
不删除节点而是删除值
的方法来达到目的:1. 将被删除的节点转移到下个节点
2. 在这之前将被删节点node的值改为下个节点的值/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} node * @return {void} Do not return anything, modify node in-place instead. */ var deleteNode = function(node) { node.val = node.next.val // 当前节点的值改为下个节点的值,例[4,5,1,9]中的5改为1,链表变为[4,1,1,9] node.next = node.next.next // 删除下个节点,此时,node.next.next从[1,9]变为[9],链表最后为[4,1,9] }
复杂度分析
时间复杂度:O(1),没有循环
空间复杂度: O(1), 没有任何数组或者矩阵解题思路2
将要删除的元素和下一个元素合并成一个,使用
Object.assign(目标对象, 源对象, 源对象……)
方法JS中的对象都是内存引用,也就是说 node 这个变量里只保存了内存地址
所以我们如果单纯的使用 node = node.next 方法是不行的,因为这仅仅改变了 node指针所指向的内存地址,node 与 node.next 都指向了node.next 的地址
Object.assign()方法是将所有源对象都合并到目标对象上并且覆盖在目标对象所指向的内存地址上
在这道题里,我们就是要把 node.next和 node合并,并存到 node 所指向的内存地址上,Object.assign()方法合并时,目标对象属性会被源对象中相同的属性覆盖,不同的属性添加到目标对象中,所以 node.next中的属性会覆盖 node
var deleteNode = function(node) { Object.assign(node, node.next) }
-
删除链表中的节点
2021-11-02 18:19:34请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 问题分析: 在数组中,因为...问题描述:
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。题目数据保证需要删除的节点 不是末尾节点 。
问题分析:
在数组中,因为存储空间的连续,不能单独删除其中的一段空间,所以删除数组中某个元素时可以采用将后续元素前移的方式删除 这题因为node的前一个结点指向了node的空间且无法改变,所以只能删除node的值而无法释放node的空间,记只能通过将node后序结点的值深拷贝到当前空间,完成对node的值的删除问题求解:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public void deleteNode(ListNode node) { ListNode nodeNext = node.next; node.val = nodeNext.val; node.next = nodeNext.next; } }
问题总结:
老规矩先看官方求解。
方法一:和下一个节点交换
删除链表中的节点的常见的方法是定位到待删除节点的上一个节点,修改上一个节点的 \textit{next}next 指针,使其指向待删除节点的下一个节点,即可完成删除操作。这道题中,传入的参数 \textit{node}node 为要被删除的节点,无法定位到该节点的上一个节点。注意到要被删除的节点不是链表的末尾节点,因此 \textit{node}.\textit{next}node.next 不为空,可以通过对 \textit{node}node 和 \textit{node}.\textit{next}node.next 进行操作实现删除节点。
在给定节点 \textit{node}node 的情况下,可以通过修改 \textit{node}node 的 \textit{next}next 指针的指向,删除 \textit{node}node 的下一个节点。但是题目要求删除 \textit{node}node,为了达到删除 \textit{node}node 的效果,只要在删除节点之前,将 \textit{node}node 的节点值修改为 \textit{node}.\textit{next}node.next 的节点值即可。
例如,给定链表 4 \rightarrow 5 \rightarrow 1 \rightarrow 94→5→1→9,要被删除的节点是 55,即链表中的第 22 个节点。可以通过如下两步操作实现删除节点的操作。
将第 22 个节点的值修改为第 33 个节点的值,即将节点 55 的值修改为 11,此时链表如下:
4 \rightarrow 1 \rightarrow 1 \rightarrow 9
4→1→1→9删除第 33 个节点,此时链表如下:
4 \rightarrow 1 \rightarrow 9
4→1→9达到删除节点 55 的效果。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/solution/shan-chu-lian-biao-zhong-de-jie-dian-by-x656s/
来源:力扣(LeetCode) -
C语言实现双向链表删除节点、插入节点、双向输出等操作
2021-05-23 08:12:53#include#includetypedef struct DoubleLinkedList{int data;struct DoubleLinkedList *pre;struct DoubleLinkedList *next;...//建立链表DlinkedList_Node* createDLink(){DlinkedList_Node *head,*p,*s...#include
#include
typedef struct DoubleLinkedList
{
int data;
struct DoubleLinkedList *pre;
struct DoubleLinkedList *next;
}DlinkedList_Node;
//建立链表
DlinkedList_Node* createDLink()
{
DlinkedList_Node *head,*p,*s;
int x;
head = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
p = head;
while(1)
{
printf("please input the data:
");
scanf("%d",&x);
if(x != 65535)
{
s = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
s ->data = x;
s-> pre = p;
p->next = s;
p=s;
}
else
{
printf("
数据输入结束
");
break;
}
}
p->next = NULL;
head = head ->next;
head->pre = NULL;
return head;
}
//顺序、反序打印链表
void printDLink(DlinkedList_Node *head)
{
DlinkedList_Node *p,*s;
p = head;
printf("正序输出双向链表:
");
while(p)
{
printf("%d ",p->data);
s = p;
p = p->next;
}
printf("
逆序输出双向链表:
");
while(s)
{
printf("%d ",s->data);
s = s->pre;
}
printf("
");
}
//删除一个结点
DlinkedList_Node* deleteDlinkedList_Node(DlinkedList_Node *head,int i)
{
DlinkedList_Node *p;
p = head;
if(p->data == i)
{
head = p->next;
head->pre = NULL;
free(p);
return head;
}
while(p)
{
if(p->data == i)
{
p->pre->next = p->next;
p->next->pre = p->pre;
free(p);
return head;
}
p = p->next;
}
printf("没有找到想要删除的数据
");
return head;
}
//插入一个结点
DlinkedList_Node* insertDlinkedList_Node(DlinkedList_Node *head,int i)
{
DlinkedList_Node *p,*temp;
p = head;
temp = (DlinkedList_Node*)malloc(sizeof(DlinkedList_Node));
temp ->data = i;
if(i < p->data)//比头结点数据小,插入到链表头部
{
head = temp;
head->next = p;//此处p为原来的head
head->pre = NULL;
p->pre = head;//此处p为原来的head
return head;
}
while(p != NULL && i > p->data)//寻找合适的插入位置
{
p = p->next;
}
if(i < p->data)//在链表中间某处找到合适插入位置
{
temp ->next = p;
temp ->pre = p->pre;
p ->pre->next = temp;
p ->pre = temp;
return head;
}
else//没有找到合适的位置,只有将数据插入到链表尾部
{
p->next = temp; //遍历到链表尾部,p==NULL
temp ->pre = p;
temp ->next = NULL;
return head;
}
}
int main()
{
DlinkedList_Node *head;
head = createDLink();
printDLink(head);
head = insertDlinkedList_Node(head,1012);
head = deleteDlinkedList_Node(head,1991);
printDLink(head);
}
/*****************************
运行结果如下:
please input the data:
1991
please input the data:
1992
please input the data:
2013
please input the data:
2014
please input the data:
512
please input the data:
420
please input the data:
65535
数据输入结束
正序输出双向链表:
1991 1992 2013 2014 512 420
逆序输出双向链表:
420 512 2014 2013 1992 1991
正序输出双向链表:
1012 1992 2013 2014 512 420
逆序输出双向链表:
420 512 2014 2013 1992 1012
******************************/
-
【JAVA】删除链表中的节点
2022-01-17 18:23:12请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点 不是末尾节点 。 示例 1: 输入:... -
删除链表的节点(JS)
2022-03-05 23:23:42解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next =... -
单向链表删除链表中的某个节点
2021-08-21 08:43:05实现一个算法,删除单向链表中间的某个节点,假设你只能访问该节点 实例: 输入单向链表a-b-c-d-e中的节点c 结果,不返回任何数据,但该链表变为a-b-d-e 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回... -
c++如何删除链表中的节点
2021-11-16 18:23:541,删除链表中某一个节点的地址 //非零即为真,利用这个删除前先判断这个链表的节点是不是空的 void delete (long num){ if(!head){ cout<<"null"; return ;//直接退出程序 } list * p=head; if(p->... -
双向链表删除指定节点,JAVA实现
2022-02-24 15:37:05构造双向链表,删除指定节点: public class NodeTest { static class MyNode { int val; MyNode preNode; MyNode nextNode; public MyNode(int val, MyNode preNode, MyNode nextNode) { this.val = val;... -
删除链表节点 -- java
2021-11-09 12:37:44给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。 链表节点与函数定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } ... -
237.图解删除链表中的节点(leetcode)
2020-11-19 19:15:43请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。 说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的... -
删除链表中的节点(C语言)
2022-02-23 18:43:49请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点head ,只能直接访问 要被删除的节点 。 -
删除链表中指定节点
2021-03-05 15:21:56删除链表中指定节点 思路:利用其他结构(这里利用栈结构)存放链表中除要删除的节点外的其他节点。依次将链表元素放入栈中,当遇到要删除的元素时跳过,最后将栈中元素重新连接成链表。 具体代码 public class ... -
删除链表的指定的节点
2021-05-05 22:14:17删除链表的指定的节点 删除指定的节点是头节点,就让 p = p->next; head = p; 删除指定的节点是非头节点,直接跳过指定结点,即:p->next = p->next->next; 如果是动态malloc开辟的空间,在删除... -
python---删除链表中某个节点
2021-03-12 16:32:51请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点。 示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:给定你链表中值为5的第二个节点,那么在... -
算法题:删除链表中指定值的节点(Java实现)
2019-07-02 18:08:14去美菜网面试,第一道算法笔试题就是这个,题目很清楚,删除链表中指定值的节点,假定有这样的链表:1->2->6->3->4->5->6,现在要求删除值为6的节点,输入数组[1,2,6,3,4,5,6],要求输出:[1,2,3,... -
乐扣简单题(237)js--删除链表中的节点
2022-03-11 11:08:57链表是由多个元素组成的列表,元素存储不连续,用next指针连在一起。 数组和链表的区别: 数组增删非首尾元素时往往需要移动元素 链表增删首尾元素不需要移动元素,只需要更改next指向即可 JS中没有链表,但是... -
C语言中关于如何删除链表的某个节点问题
2019-12-19 21:27:02关于这个问题,基本思路是先将要被删除节点的上一个节点和下一个节点连接起来,然后再把要删除的节点释放掉就行了。 首先先定义一个链表: struct STU { int a; int b; int c; struct STU *next; } struct STU ... -
图示详解删除链表的倒数第K个节点
2019-11-19 23:30:52给定一个链表,删除链表的倒数第n个节点,并且返回链表的头节点 示例: 给定一个链表:1->2->3->4->5,和 n = 2 当删除了倒数第二个节点后,链表变为 1->2->3->5 说明:给定的n保证是有效的,... -
java 删除链表中的节点
2020-03-04 09:33:17/** * 链表节点 * @author Administrator * */ public class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public class LinkDelete { /** ... -
JS删除链表的节点
2020-05-16 12:27:35给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用... -
在单向链表中删除节点——C语言基础
2021-07-22 07:36:06前言:从链表中删除一个节点与插入一个节点类似,关键在于查找,但需要注意的是,删除一个节点 并不是真的删除了,而是将需要删除的节点从链表中分离出来,最后将这个结点用free函数释放掉。 文章目录向单向链表中... -
链表的删除结点(各种方法)
2021-09-15 11:03:28一、链表中删除第i个结点 int main() { int i; Node *p,*head,*k; head=setlink(); scanf("%d",&i); int v=1; for(p=head->next;p!=NULL;k=p,p=p->next) { if(v==i)break; else{ v++; ... -
Java链表删除节点操作
2019-03-27 16:07:30只要输入要删除学生的成绩,就可以遍历该链表,并清除学生的节点, * 要结束输入时,输入“-1”,则此时会列出该链表未删除的所有学生数据。 * * @author 86176 * */ //构建节点类 public class Node { int ... -
用C++编程实现链表删除某结点
2009-11-02 21:54:21主要利用用C++中的指针编程实现删除链表中的某结点 -
删除链表节点的三种方式
2020-07-30 09:27:44把下一个节点的值赋给当前要删除的节点 当前节点指向下下个节点 /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {... -
链表删除指定位置节点 -- C语言
2020-02-15 23:44:43传入的是个双重指针st_dataNode** phead,因为删除在首节点的位置时候,链表头的位置会发生改变,指向新的节点,所以需要传入双重指针,以便接收修改的新的链表头的位置 代码实现 st_dataNode * removeListNode... -
leetcode(链表) 删除链表中的节点
2020-04-25 21:40:01删除链表中的节点 ... 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 --head =[4,5,1,9],它可以表示为: 示例 1: 输入: head = [...