コンテンツ
兄弟よ、働き続けて、質問をブラッシングすることは永遠の王です!!!!!!
序文:
兄弟よ、働き続けて、質問をブラッシングすることは永遠の王です!!!!!!
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; } }
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; } }
兄弟よ、あなたはもっと質問をしなければなりません、一緒に来てください!