1、リストの末尾から印字ヘッド
#入力リスト、頭に尾からのArrayListリストの順番で返された値を。
クラスListNode: DEF __init__ (セルフ、X): self.val = X self.next = なし クラスソリューション: DEF printListFromTailToHead(セルフ、listnode): #の書き込みコードここでは壁紙 L = [] ヘッド = listnode しばらくのヘッド: l.insert( 0、head.val) #の挿入 ヘッド= head.next 戻り L
図2は、リストの最後から二番目のKノード
#入力されたリンクリスト、リンクリスト出力の逆数k番目のノード。
クラスのソリューション: DEF FindKthToTail(セルフ、頭、K): #の書き込みコードここでは壁紙 L = [] しばらく頭=!なし: l.append(頭) 頭 = head.next IF K> LEN(L)または K <1。 : リターン リターン L [-k]
3、逆リスト
#入力リンクリスト、反転リスト、出力ヘッダの新しいリスト。
クラスのソリューション: #はListNode返し DEF :ReverseList(自己、PHEAD) #のコードを記述し、ここで壁紙 L = [] IF PHEAD == なし: 返す しばらくPHEAD: l.insert(0、PHEAD) PHEAD = pHead.nextを するために私にレンジ( LEN(L)-1 ): L [I] .next = L [I 1 + ] Lを[ -1] .next = なし リターン L [0]
4、2つのソートされたリストをマージ
ルールの減少- #二は単調もちろん、その後私たちは、合成リストを満たすために必要な、二つのリストを合成した後、入力リストおよび出力リストを増加させることができます。
クラスソリューション: DEF マージ(セルフ、pHead1、pHead2): L1 = [] L2 = [] 一方pHead1: l1.append(pHead1) pHead1 = pHead1.next 一方pHead2: l2.append(pHead2) pHead2 = pHead2.next L + L1 = L2 IF == L []: 返さないなし ための I にレンジ(LEN(L)-1) のための J における範囲(I + 1 、LEN(L)): もし L [I] .val> L [J] .val: L [I]、L [J] = L [J]、L [I ] のための T における範囲(LEN(L)-1 ): .next L [T] = 1 [T + 1 ] L [ -1] .next = なし リターン L [0]
5、リストをコピーするためにコピーします
#複雑な入力リスト(各ノードがノードの値を有し、二つのポインタ、次のノードへのポインタ、他のノードに特別なポインタ)、#の
ヘッドは、コピーした後、複雑なリンクされたリストの値を返します。(そうでない場合はプログラムが空の宣告直接の質問に戻りますが、出力結果は、パラメータノード参照を返さないことに注意してください)
クラスRandomListNode:
デフ __init__ (自己、X): self.label = X self.next = なし self.random = なし クラスソリューション: #返回RandomListNode デフクローン(自己、PHEAD): #の書き込みコードここで もし ないPHEAD: 返却なし CUR = PHEAD 一方CUR: TMP = RandomListNode(cur.label) tmp.next = cur.next cur.next =tmpが 貢献 = tmp.next 貢献 = ペットを しながら:追加 TMP = cur.nextを IF cur.random: tmp.random = cur.random.nextが 貢献 = tmp.next 貢献 = ペット RESが = pHead.nextを しながら:cur.next TMP = cur.next cur.next = tmp.next 貢献 = tmpに 復帰 RES
6、二分探索木と二重リンクリスト
#バイナリ検索ツリーを入力し、双方向リンクリストの並べ替えにバイナリ検索ツリーに変換します。 #の要件のみツリーノードポインタを調整するために、ポイントを任意の新しいノードを作成することはできません。 クラスのソリューション: DEF 変換(自己、pRootOfTree): #の書き込みコードここでは壁紙 IF ない pRootOfTree:返す self.arr = [] self.midTraversal(pRootOfTree) のための I、V で列挙(self.arr [: - 1 ]): V .RIGHT = self.arr [I + 1。] self.arr [Iは + 1] .LEFT = Vの 戻りself.arr [0] DEF midTraversal(セルフ、根): IF ていませんルート:返す self.midTraversal(root.left) self.arr.append(ルート) self.midTraversal(root.rightを)
図7に示すように、二つのリストの第1の共通ノード
#その第1の共通のノードを見つけるために、二つのリストを入力します。
クラスのソリューション: DEF FindFirstCommonNode(セルフ、pHead1、pHead2): #の書き込みコードここでは壁紙 L1 = [] 結果 = [] しばらくpHead1: l1.append(pHead1.val) pHead1 = pHead1.next しばらくpHead2: IF pHead2.val でL1 : result.append(pHead2) pHead2 = pHead2.next のIF結果が== []: 返さないなし 他: 戻り結果[0]
図8に示すように、リストのエントリのリングノード
リンクされたリストから#、前記リングが含む場合、エントリのリングノードリストを見つけるには、そうでない場合は、ヌル出力します。
クラスのソリューション: DEF EntryNodeOfLoop(セルフ、PHEAD): #の書き込みコードここでは壁紙 L = [] しばらくPHEAD: l.append(PHEAD) PHEAD = pHead.next IF PHEAD でL: リターン PHEAD
9、重複したノードリストを削除
ソートされたリンクリストのノードで#複製、重複するノードのリストを削除し、ノードが繰り返さ保持していない、ヘッド・ポインタ・リストを返します。
#例えば、リスト1-> 2-> 3-> 3-> 4-> 4-> 5後処理1-> 2-> 5
#:最初のトラバーサル、リストよう- >リスト、リストが削除さ繰り返されます新しいリスト再生リストの要素
クラスソリューション: DEF deleteDuplication(セルフ、PHEAD): ヴァルス = [] ノード = [] 一方PHEAD: vals.append(pHead.val) nodes.append(PHEAD) PHEAD = pHead.next ヴァルスリスト=(フィルタ(ラムダ C:vals.count(C)== 1 、ヴァルス)) ノード =リスト(フィルタ(ラムダ D:d.val でヴァルス、ノード)) 場合、ノードは== []: 返さないなし ための I における範囲(LEN(ノード)-1 ): ノード[I] .next =ノード[I + 1 ] のノード[ -1] .next = なし リターンノード[0]