安全プログラムのタイトル(パイソン)を証明するためにオファー - リスト

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]

 

おすすめ

転載: www.cnblogs.com/fighting25/p/11265271.html