您的位置:首页 > Web前端 > Node.js

LeetCode-237. Delete Node in a Linked List

2018-01-20 10:09 232 查看

Description



Solution 1(C++)

/**
* 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=*(node->next);
}
};


Solution 2(C++)

/**
* 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) {
ListNode* temp=node->next;
*node= *temp;
delete temp;
}
};


算法分析

解法一只是更改了链表的结构,并没有删除原来的结点。而解法二删除了原来的结点。

这两种解法可以这样理解,题目说“删除”结点,其实意思就是改变原来的链表结构,使1->2->3->4,变为1->2->4。可以看成,将3删除了,然后将2与4连接起来,这就是解法二的思路。当然也可以看成将3替换成了4,这就是解法一的思路。

解法一: 要知道,对于node,node,就是上一个结点中 (node->next)的值,那么将上一个结点中的下一个结点指针改为该结点的下一个结点指针,就完成了结点的“删除”,通过结点的”替换“。所以有:

*node=*(node->next);


解法二: 要确确实实的删除结点node。那么就可以创建一个临时的ListNode* 的temp,先按照解法一的方法,让:

temp=node->next;


然后,让:

*node=*temp;


最后,delete temp就可以了。注意,这里不是delete node。因为node已经替换成下一个结点了。而原结点已经在temp中了。所以应该删除temp,而不是node。

程序分析

这里涉及到了许多指针运算。还是要搞清楚一点:指针本身就是个地址。但是指针指向的对象(通过 * 运算符实现)才是目标实体。通过指针取指针对应结构体中成员变量,和常见的this-> 用法相同,可以学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: