単一リンクリストのヘッドポインタと削除するノードの値を指定して、ノードを削除する関数を定義します。
削除されたリンクリストのヘッドノードを返します。
注:この質問は、元の質問と比較して変更されています
例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 ++言語を使用している場合は、削除されたノードを解放または削除する必要はありません。
問題解決のアイデア:
この質問では、valの値を持つノードを削除するには、ノードの検索と参照の変更の2つの手順が必要です。
ノードを見つける:head.val == valまでリンクリストをトラバースし、ジャンプしてターゲットノードを見つけます。
参照を変更します。ノードcurの先行ノードをpreとして設定し、後続ノードをcur.nextとして設定します。次に、pre.next = cur.nextを実行して、curノードを削除します。
アルゴリズムフロー:
1.特殊なケースの処理:ヘッドノードのヘッドを削除する必要がある場合は、head.nextを直接返します。
2.初期化:pre = head、cur = head.next。
3.ノードを見つけます:curが空の場合、またはcurノードの値がvalに等しい場合にジャンプします。
3-1。現在のノードインデックスを保存します。つまり、pre = curです。
3-2。次のノード、つまりcur = cur.nextをトラバースします。
4.ノードの削除:curがノードを指している場合は、pre.next = cur.nextを実行します。curがnullnullを指している場合は、リンクリストに値valのノードが含まれていないことを意味します。
5.戻り値:リンクリストのヘッドノードを返します。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(head->val == val) return head->next;//当头节点为val时,返回头节点的下一个节点
ListNode *pre = head, *cur = head->next;//pre为赋值头节点
//cur赋值为头节点下一个节点
//当前节点非空 且 当前节点的值不等于val
while(cur != nullptr && cur->val != val) {
//遍历链表
pre = cur;
cur = cur->next;
}
//此时因此了条件cur->val == val
if(cur != nullptr) pre->next = cur->next;//删除当前节点
return head;
}
};
複雑さの分析:
時間計算量O(N):Nはリンクリストの長さです。削除操作は平均でN / 2回ループする必要があり、最悪の場合はN回です。
スペースの複雑さO(1):cur、一定サイズの余分なスペースを占有します。
著者:jyd
リンク:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/solution/mian-shi-ti-18-shan-chu-lian-biao -de-jie-dian-sh-2 /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。