道を外れる[データ構造]

コンテンツ

序文:

兄弟よ、働き続けて、質問をブラッシングすることは永遠の王です!

1.チェーン表面テストの質問

1.リンクリストのセグメンテーション

問題の説明:

問題分析:

問題が解決しました:

コード:

2.リンクリスト内の重複ノードを削除します 

問題の説明:

 問題分析:

問題が解決しました:

コード:


序文:

兄弟よ、働き続けて、質問をブラッシングすることは永遠の王です!

1.チェーン表面テストの質問

1.リンクリストのセグメンテーション

問題の説明:

既存のリンクリストのヘッドポインタListNode*  pHeadは、特定の値xが与えられた場合、x未満のすべてのノードにコードを書き込みます。

残りのノードの前に配置され、元のデータの順序を変更できない場合は、再配置されたリンクリストのヘッドポインタを返します。

問題分析:

リンクリストがあるとします。

 値Xが与えられたとすると、Xより小さいノードは残りのノードの前にランク付けされ、元のデータ構造を変更することはできません。つまり、X = 10の場合、12、3、5、23、 56は次のとおりです。元のデータ構造の順序は変更できません。

問題が解決しました:

まず、X未満の部分とXより大きい部分を、それぞれ2つのノードbs、beおよびas、aeを定義する2つのリンクリストと見なすことができます。これらはすべてnullを指します。headに等しいcur変数を定義した後、図を参照してください。

 次に、curヘッドバイトがリンクリストを逆方向にトラバースし始め、curがnullの場合、トラバーサルは終了します。

ステップ1:12と15のサイズを比較します。15未満であるため、bsとbeのリンクリストに配置されます。初めて、bsとはバイト12を指します。

ステップ2:

3は15未満であるため、Curは逆方向に進み続け、bsとbeのリンクリストに配置されます。このとき、be.next = cur、be=be.nextとします。写真を見てください:

3番目のステップ:23は15より大きいため、curは後方に移動し続け、asおよびaeリンクリストに配置されます。初めてasおよびaeがバイト23を指す場合、

ステップ4:5は15未満であるため、curは引き続き後方に移動し、bsとbeのリンクリストに配置されます。このとき、be.next = cur、be=be.nextとします。写真を見てください:

ステップ5:curは最後のノードに移動します。56は15より大きいため、as、aeリンクリストに配置されます。この時点で、ae.next = cur、ae=ae.nextとします。図を参照してください。

ステップ6:図に示すように、be.next = asとし、最後に頭に戻ります。

 ステップ7:

この質問の一般的な考え方は明らかですが、対処すべき詳細がまだいくつかあります。それについて考える必要があります。1。先にデータがない可能性があります。つまり、すべての値がXよりも大きい可能性があります。この場合、それだけで戻る必要があります。2.最後のデータはxより大きくなければなりませんか?ただし、X未満の場合、リンクリストにはテールノードがないため、後半にデータがある場合は、最後のbyte.nextを手動でnullに設定する必要があります。

コード:

public class Partition {
    public ListNode partition(ListNode head, int x) {
        ListNode cur = head;
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        while(cur != null){
            if(cur.val < x){
                if(bs == null){
                    //第一次
                bs = cur;
                be = cur;
            }else{
                    be.next = cur;
                    be = be.next;
                }
            }else{
                if(as == null){
                    as = cur;
                    ae = cur;
                }else{
                    ae.next = cur;
                    ae = ae.next;
                }
            }
            cur = cur.next;
            
        }
        if(bs == null){
            return as;
        }
        be.next = as;
        if(as != null){
            ae.next = null;
        }
        return bs;
        
    }
}

リンクリストSegmentation_NiokeQuestionBa_Niuke.com [Niu Ke Question Ba]は、さまざまな企業の高頻度の学校で採用されたペンインタビューの質問を収集し、公式の問題解決策を提供し、Baidu、Alibaba、Tencent、Netease、およびその他の有名なインターネット企業のオンライン練習を行っています専門家が古典的な試験の質問について話し合い、技術力を包括的に向上させますicon-default.png?t = M276https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview /質問ランキング 

2.リンクリスト内の重複ノードを削除します 

問題の説明:

ソートされたリンクリストに重複ノードがあります。リンクリスト内の重複ノードを削除してください。重複ノードは保持されず、リンクリストの先頭へのポインタが返されます。たとえば、リンクリスト1-> 2-> 3-> 3-> 4->4->5は1->2->5として処理されます。 

 問題分析:

1.複数の要素が繰り返される

2.繰り返される要素は互いに隣接している必要があります

問題が解決しました:

同様に、head変数とcur変数の2つの参照変数を定義し、headは常にリンクリストのheadノードを指し、curは逆方向にトラバースして重複ノードを見つけます。

まず、最初のノードが2番目のノードと等しくないかどうかを判断する必要があります。cur.valがcur.next.valと等しくない場合、最初のノードが後者と繰り返される可能性がありますが、繰り返されるノードを削除して、最終的に簡単にする結果として、ヘッドノードが見つからないため、別の仮想ノードを作成して、繰り返されないすべてのノードが仮想ノードの背後にあるようにします。仮想ノードnewHeadを作成し、newHeadの代わりに移動するtmpを定義します。

 12と23は同じですか?そうでない場合は、curとtmpを一緒に文字列化し、tmp.next=curとします。

次に、tmp = tmp.next、cur=cur.nextとします。

このようにしてループを書くことができます。コードを見てみましょう。 

コード:

public class Solution {
    public ListNode deleteDuplication(ListNode head) {
        ListNode newHead = new ListNode(-1);
        ListNode tmp = newHead;
        ListNode cur = head;
        while(cur != null){
            if(cur.next != null && cur.val == cur.next.val){
                while(cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;
                }
                cur = cur.next;
            }else{
                tmp.next = cur;
                tmp = tmp.next;
                cur = cur.next;
            }
           
        }
        tmp.next = null;
        return newHead.next;

    }
}

リンクリストの重複ノードを削除し、模擬試験の練習、専門家との古典的な試験の質問について話し合い、技術的能力を包括的に向上させますicon-default.png?t = M276https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=13 && tqId = 11209&rp = 1&ru = / activity / oj&qru = / ta/coding-インタビュー/質問-ランキング 

兄弟よ、あなたはもっと質問をしなければなりません、一緒に来てください! 

 

おすすめ

転載: blog.csdn.net/m0_64397675/article/details/123486067