溶液:
この問題は、それぞれ、二つの方法があり、再帰法は反復です。
方法:反復法:
二つのポインタを使用しては実装され
、二つのポインタは、事前CURRある
一時変数のTEMPプラス。
- 初期化なしを事前ません。CURR初期化ヘッド。
- 次にTEMP = curr.next(後で使用するために、ノードに格納されている)させ、
- curr.next =プレ(ノードとそれに先行する現在のノード間の接続を確立するために)。
- 事前= CURR(前進予備)。
- CURR = TEMP(CURR前進)。
- 最後に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 ... head.next = 2
ヘッド= 2 ... head.next = 3
ヘッド= 3 ... head.next = 4
ヘッド= 4 ... head.next = 5
ヘッド= 5 ... head.next =なし - 戻り再帰
ケース再帰終了条件に遭遇する、戻り、現在のヘッド5のリターン即ちCUR = 5;我々はヘッドに割り当てるヌル点ノード、ヌルに頭第1の接合点にhead.next.nextケース点(5)結果。
下図のように:
- 二つの再帰的な戻り
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