leetcode 206リバースリスト(パイソン)

ここに画像を挿入説明
溶液:
この問題は、それぞれ、二つの方法があり、再帰法は反復です。

方法:反復法:
二つのポインタを使用しては実装され
、二つのポインタは、事前CURRある
一時変数のTEMPプラス。

  1. 初期化なしを事前ません。CURR初期化ヘッド。
  2. 次にTEMP = curr.next(後で使用するために、ノードに格納されている)させ、
  3. curr.next =プレ(ノードとそれに先行する現在のノード間の接続を確立するために)。
  4. 事前= CURR(前進予備)。
  5. CURR = TEMP(CURR前進)。
  6. 最後にCURR、最後の前のリターンノードでなし、ではありません。
    次のように示した
    最初の反復:
    ここに画像を挿入説明
    第2の反復を:
    ここに画像を挿入説明
    コードは以下の通りであります:
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:

    def reverseList(self, head):

    	pre = ListNode(None)
    	curr = head
    	tmp = ListNode(None)

    	while curr:

    		tmp = curr.next

    		curr.next = pre

    		pre = curr

    		curr = tmp




    	return pre

方法2:再帰

(より容易にビューのコードポイントと併せて理解される)
、例えば、末端にリストをトラバースするために与えられたリストのために、我々最初必要、[1,2,3,4,5]、そして最終的に再帰トラバーサル5に戻り、
すなわち、現在のヘッドは、リストに反対方向を達成するために、なし、ノード点のhead.next.nextなし、ノード5(head.next.next =ヘッド)に割り当てhead.next.nextとしてhead.next、5接続、および再帰的リターンに、CURは5後戻され、ヘッド4となり、次いでhead.next = 5、head.next.next 5ノードのノードへのポインタである。head.next我々はそう.nextヘッドが割り当てられ、点5が撮影接合は接続点4とは逆で達成されます。

:再帰的な手順は以下の通りである
1-> 2-> 3-> 4-> 5->なし

  1. 先遍历到链表的末尾、
    ヘッド= 1 ... head.next = 2
    ヘッド= 2 ... head.next = 3
    ヘッド= 3 ... head.next = 4
    ヘッド= 4 ... head.next = 5
    ヘッド= 5 ... head.next =なし
  2. 戻り再帰
    ケース再帰終了条件に遭遇する、戻り、現在のヘッド5のリターン即ちCUR = 5;我々はヘッドに割り当てるヌル点ノード、ヌルに頭第1の接合点にhead.next.nextケース点(5)結果。
    下図のように:
    ここに画像を挿入説明
  3. 二つの再帰的な戻り
    CUR値5、ノード5のヘッド4、head.nextのためのこの時間は、それゆえhead.next.nextは、次のような効果を達成するために頭を=
    ここに画像を挿入説明
    ループを防ぐために、我々はhead.nextなし]を=しない設定する必要があります。

頭部への再帰的なリターンのプライマリバック、そして最後に。

コードは以下の通りであります:

class Solution:

    def reverseList(self, head):

    	if head == None or head.next == None:
    		return head

    	cur = reverseList(head.next)

    	head.next.next = head
    	head.next = None

    	return cur
公開された100元の記事 ウォンの賞賛3 ビュー10000 +

おすすめ

転載: blog.csdn.net/cy_believ/article/details/104626211