Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.
Supposed the linked list is 1 -> 2 -> 3 -> 4
and you are given the third node with value 3
, the linked list should become 1 -> 2 -> 4
after calling your function.
第一次看这个题目,以为从头节点开始,找到需要删除的那个结点,然后按照正常的思路,该结点的前结点指向后结点,然后删除该结点。但是提交并没有通过,于是查看solution才发现这个思路过于传统。不如将后面那个结点的地址传给前面的那个结点,相当于这个结点就成了后面这个结点。
/**
* 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) {
auto next = node->next;
*node = *next;
delete next;
}
};
上述代码中,用next指向node->next,然后将next的首地址*next赋值给*node,那么node相当于就是一个指向原来的node->next的指针。
换一种思路的话,就是将node->next的 val 和 next 都赋值给node。即将node->next复制了一遍给node。同样实现了所谓的删除功能。