序文
特別なトピックの形でブラッシングの投稿を更新します。私と一緒にブラッシングを学ぶことを歓迎します。私を信じてください。あなたの粘り強さは間違いなく予期しない利益をもたらします。それぞれの質問は簡単な答えを提供します、あなたがよりエレガントなアプローチを持っているなら、ガイダンスを提供することを歓迎します、ありがとう
【トピック説明】
単一リンクリストを逆にします。たとえば、リンクされたリストは次のとおりです。
1-> 2-> 3-> 4
反転後
4-> 3-> 2-> 1
【請求】
リンクリストの長さがNの場合、時間の複雑さはO(N)に達し、余分なスペースの複雑さはO(1)に達します。
【困難】
タクシー:★☆☆☆
【回答】
方法1
この質問は非常に単純です。ノードを逆にする場合は、ノードのリアドライブを変更して、前のノードを指すようにします。ここで注意すべき点は、現在のノードの後ろを前に向けると、リンクされたリストがこの時点で切り捨てられることです。つまり、後ろのノードが現在のノードから分離されているため、現在のノードの後ろを保存するための変数が必要です。ドライブ、訪問は失われました。
具体的なコードは次のとおりです。
コードは以下のように表示されます
1//节点
2class Node{
3 public int value;
4 public Node next;
5 public Node(int data) {
6 this.value = data;
7 }
8}
メインコード
1 //単一リンクリストを逆にする
2public static Node reverseList(Node head){
3 Node next = null; //現在のノードの後ろを指す4Node
pre = null; //現在のノードの前のノードを指す5while
(head!= null ){
6 next = head.next;
7 //現在のノードのバックドライブは先行ノードを指します
8head.next = pre;
9 pre = head;
10 //次のノードを処理します11head
= next;
12}
13 return pre;
方法2
この問題は、reverse()メソッドの関数が単一リンクリストを逆にすることであると仮定すると、再帰を使用して実行することもできます。再帰的方法を使用する場合、子リンクリストを引き続き再帰的に実行できます。たとえば、次のリンクリストの場合:
子リンクリスト2-> 3-> 4、つまり
ノードnewList = reverse(head.next)を繰り返します。再帰後の結果は次のとおりです。
反転後、子リスト2-> 3->は4-> 3-> 2になります。
reverse()の関数はリンクされたリストを逆にすることであると仮定したことに注意してください。ただし、この時点では、ノード1はまだノード2を指しています。このとき、ノード1と2を再度反転し、1の次のノードがnullを指します。示されているように:
再帰の終了条件は次のとおりです。子リンクリストにノードが1つしかない場合、またはnullの場合、再帰は終了します。コードは次のように表示されます。
1 //用递归的方法反转链表
2 public static Node reverseList2(Node head){
3 if (head == null || head.next == null) {
4 return head;
5 }
6 //递归反转子lian链表
7 Node newList = reverseList2(head.next);
8 //第三张图
9 head.next.next = head;
10 head.next = null;
11 return newList;
12 }
問題の拡大
トピック:リンクリストノードの逆の部分
【トピック説明】
トピック:単一リンクリストのヘッドノードヘッドと、fromとtoの2つの整数が与えられた場合、シングルチェーンリストのfromノードとtoノードを逆にします。
列如:
1-> 2-> 3-> 4-> 5-> null、from = 2、to = 4
結果:1-> 4-> 3-> 2-> 5-> null
としてリストされています:
1-> 2-> 3-> null from = 1、to = 3
結果は3-> 2-> 1-> nullです
【請求】
1.リンクリストの長さがNの場合、時間の複雑さの要件はO(N)であり、追加のスペースの複雑さの要件はO(1)です。
2. 1 <= from <= to <= Nが満たされない場合、調整は行われません
【困難】
タクシー:★☆☆☆
【回答】
自分でやったり、考えたりすることができます。答えを知りたい場合は、公式アカウントで答え2に返信してコードを取得できます。
- 終わり -
過去
【リンクリストの問題】単一リンクリストの中間ノードを削除する
[リンクリストの問題]単一リンクリストのK番目のノードを削除します
[アルゴリズムの戦闘]ウィンドウの最大値の配列を生成する