/*刪除鏈表中的某一個結點(本題不用考慮尾結點)
通用方法(給的是鏈表頭結點):能夠從頭結點開始遍歷到要刪除結點的上一個結點,而後該結點指向要刪除結點的下一個結點,刪除要刪除的結點,不過需花費O(n)
方法2(給的是要刪除結點):對於非尾結點,將下個結點的內容複製到本結點,在刪除掉下一個結點便可(O(1)),
可是對尾結點,則只能從鏈表頭結點開始遍歷到尾結點的前一個結點(O(n))
*/
/**
* 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; //*爲取內容運算符,將指針指向的結構體內容複製過去
//真的刪除
/* ListNode* temp = node->next;
*node = *temp; //將指針指向的結構體內容複製過去
delete temp; //刪除多餘的結點*/
if
(
node
==
nullptr
)
return
;
ListNode
*
pnext
=
node
->
next
;
//保存下一個結點指針,以便以後刪除
node
->
val
= pnext
->
val
;
//複製值
node
->
next
= pnext
->
next
;
//複製指針
delete
pnext
;
//掌握
}
};
/*
也可用這個(掌握)
ListNode* pnext = node->next;
node->val = node->next->val;
node->next = node->next->next;
delete pnext;
*/