剣はオファー18を指します。リンクリスト(C ++)ダブルポインターのノードを削除します

単一リンクリストのヘッドポインタと削除するノードの値を指定して、ノードを削除する関数を定義します。
削除されたリンクリストのヘッドノードを返します。
注:この質問は、元の質問と比較して変更されています

例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)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114704075