目次
単一リンク リストのヘッド ノードを指定すると head
、リンク リストを反転し、反転したリンク リストのヘッド ノードを返します。
ヒント:
- リンクリスト内のノード数の範囲は次のとおりです。
[0, 5000]
-5000 <= Node.val <= 5000
一連の考え
⭐再帰を使用する
再帰 (プログラミング スキル)_Baidu 百科事典 (baidu.com)
- プログラムが自分自身を呼び出すプログラミング手法は再帰と呼ばれます。
- プロセスまたは関数には、その定義または説明の中で直接的または間接的に自分自身を呼び出すメソッドがあります。通常、大規模で複雑な問題を層ごとに、元の問題と同様の小規模な問題に変換して解決します。再帰的戦略は A のみです。少数のプログラムを使用して、問題解決プロセスで必要な複数の繰り返し計算を記述することができるため、プログラム内のコード量が大幅に削減されます。
- 再帰の力は、有限のステートメントによるオブジェクトの無限のコレクションの定義にあります。
- 一般に、再帰には境界条件、再帰的な前方セグメント、および再帰的な戻りセグメントが必要です。
- 境界条件が満たされない場合、再帰は続行され、境界条件が満たされる場合、再帰は戻ります。
- 再帰とは、プロセスの実行中に自分自身を呼び出すことです。
再帰を形成するために必要な条件:
- 副問題は元の問題と同じである必要がありますが、より単純なものでなければなりません。
- それ自体を無制限に呼び出すことはできず、非再帰的な状態処理に簡略化された出口が必要です。
再帰的アルゴリズムは通常、次の 3 種類の問題を解決するために使用されます。
(1) データの定義を再帰的に定義します。(フィボナッチ関数)
(2) 問題の解決は再帰的アルゴリズムによって実現されます。
このタイプの問題自体には明確な再帰構造はありませんが、ハノイ問題のように反復的に解決するよりも反復的に解決する方が簡単です。
(3) データの構造形式は再帰的に定義されます。
バイナリ ツリーや一般化テーブルなどは、構造自体の固有の再帰的特性により、その操作を再帰的に記述することができます。
再帰の欠点:
通常のループなどの一般的に使用されるアルゴリズムと比較して、再帰的アルゴリズムは問題を解決する効率が低くなります。したがって、再帰がより適切なアルゴリズムや特定の状況がない限り、再帰は可能な限り避けるべきです。再帰呼び出しのプロセスで、システムは戻り点と各層の局所量を保存するためのスタックを開きます。再帰が多すぎると、スタック オーバーフローなどが簡単に発生する可能性があります。
o(* ̄▽ ̄*) コード実装
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//判断头节点是不是为空,如果为空,证明传入的链表为空
//如果head.next == null,说明已经到了链表的最后一个节点
//注意条件不能写反了
if(head == null || head.next == null){
return head;
}
//方法自己调用自己
ListNode new_head = reverseList(head.next);
head.next.next = head;
head.next = null;
return new_head;
}
}