0%

删除中间节点

题目地址

难度:

题目描述:

实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定你只能访问该节点。

示例:

1
2
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f
🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️解题过程🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️🙋‍♂️
解题过程:

思路:

依次把删除节点下一个节点的值赋值给当前节点,也就是说把要删除的节点当做下一个节点,这样把要删除节点后面的链元素依次前移。删除节点不是第一个或最后一个节点,处理特殊情况:删除的是倒数第二个节点因为它下一个节点是最后一个节点,依次调用deleteNode函数,若删除节点是倒数第二个,则直接next指针为NULL,否则递归调用deleteNode函数。

c++代码:(执行用时12ms,击败97.21%,内存消耗8.2M,击败5.84%)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
//删除的节点不为第一个或最后一个节点
//把要删除的节点变成下一个节点
node->val=node->next->val;
//如果是不是倒数第二个节点,递归删除下一个节点
if(node->next->next){
deleteNode(node->next);
}else{
//是倒数第二个节点,直接删除下一个节点
node->next=NULL;
}
}
};
⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳总 结⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳⏳
总结:

没有官方题解,效率应该还行,哈哈哈😉!。

------------- THE END! THANKS! -------------