Reverse Linked List II leetcode java
2089 ワード
タイトル:
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example: Given
return
Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
問題:
古典的なテーマはチェーンテーブルの逆順です.一般的なチェーンテーブルの逆順はチェーンテーブルを前から後まで逆順にします.これは開始位置と終了位置を与えています.方法は同じです.
3つのポインタ、startpoint、node 1、node 2を維持します.
startpointは常にreverseを開始する必要がある点の前の位置を指します.
Node 1は、シーケンスの最初にreverを必要とするnodeを指し、node 2は、シーケンスの2番目にreverseを必要とするnodeを指す.
交換後、node 1は後、node 2は前です.これでチェーンテーブル全体が逆順序になります.
コードは次のとおりです.
1
public ListNode reverseBetween(ListNode head,
int m,
int n) {
2 ListNode newhead =
new ListNode(-1);
3 newhead.next = head;
4
5
if(head==
null||head.next==
null)
6
return newhead.next;
7
8 ListNode startpoint = newhead;
//
startpointはreverseを開始する前の
9
ListNode node1 =
null;
//
reverseが後ろに行くノードが必要です
10
ListNode node2 =
null;
//
reverseが前に行くノードが必要です
11
12
for (
int i = 0; i < n; i++) {
13
if (i < m-1){
14 startpoint = startpoint.next;
//
本物のstartpointを探して
15
}
else
if (i == m-1) {
//
第1ラウンドを始める
16
node1 = startpoint.next;
17 node2 = node1.next;
18 }
else {
19 node1.next = node2.next;
//
node 1はnode 2の後ろに交換されます
20
node2.next = startpoint.next;
//
node 2は最初に交換
21
startpoint.next = node2;
//
Node 2は新しい点として
22
node2 = node1.next;
//
Node 2はnode 1の次に戻り、遍歴を続けます
23
}
24 }
25
return newhead.next;
26 }
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example: Given
1->2->3->4->5->NULL
, m = 2 and n = 4, return
1->4->3->2->5->NULL
. Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
問題:
古典的なテーマはチェーンテーブルの逆順です.一般的なチェーンテーブルの逆順はチェーンテーブルを前から後まで逆順にします.これは開始位置と終了位置を与えています.方法は同じです.
3つのポインタ、startpoint、node 1、node 2を維持します.
startpointは常にreverseを開始する必要がある点の前の位置を指します.
Node 1は、シーケンスの最初にreverを必要とするnodeを指し、node 2は、シーケンスの2番目にreverseを必要とするnodeを指す.
交換後、node 1は後、node 2は前です.これでチェーンテーブル全体が逆順序になります.
コードは次のとおりです.
1
public ListNode reverseBetween(ListNode head,
int m,
int n) {
2 ListNode newhead =
new ListNode(-1);
3 newhead.next = head;
4
5
if(head==
null||head.next==
null)
6
return newhead.next;
7
8 ListNode startpoint = newhead;
//
startpointはreverseを開始する前の
9
ListNode node1 =
null;
//
reverseが後ろに行くノードが必要です
10
ListNode node2 =
null;
//
reverseが前に行くノードが必要です
11
12
for (
int i = 0; i < n; i++) {
13
if (i < m-1){
14 startpoint = startpoint.next;
//
本物のstartpointを探して
15
}
else
if (i == m-1) {
//
第1ラウンドを始める
16
node1 = startpoint.next;
17 node2 = node1.next;
18 }
else {
19 node1.next = node2.next;
//
node 1はnode 2の後ろに交換されます
20
node2.next = startpoint.next;
//
node 2は最初に交換
21
startpoint.next = node2;
//
Node 2は新しい点として
22
node2 = node1.next;
//
Node 2はnode 1の次に戻り、遍歴を続けます
23
}
24 }
25
return newhead.next;
26 }