鍊錶反轉的大致思路
反轉鍊錶只需要不斷地將當前節點的下乙個節點的 next 指向當前節點, 然後將下個節點設定為當前節點,設定兩個引用, cur, next 分別指向當前和下乙個節點
如圖所示: cur–>1, next–>2
反轉操作為:next.next-->cur
然後移動cur
,next
一次反轉後: 當前為2, 下乙個為3
迴圈操作, 就完成了所有的反轉
指定範圍的鍊錶反轉
和全部反轉一樣, 相當於把鍊錶分為了三段, 反轉中間那段, 再將三段連線起來所以只需要將反轉範圍的前乙個節點
1
和 反轉範圍內第乙個節點2
(反轉後的最後乙個) 引用儲存下來, 用於反轉後的連線. 然後對中間的進行反轉
反轉操作完成後
所以最後需要讓節點1
指向cur
,2
指向next
, 就完成了
以下是**:
public
class
reverselink
}public
static
void
main
(string[
] args)
printlink
(head)
;// 反轉
node reversed =
reverse
(head,3,
5);printlink
(reversed);}
/** * 反轉從 begin 到 end 範圍的節點
* @param node 煉表頭結點
* @param begin 開始的位置
* @param end 結束位置
* @return 返回煉表頭結點
*/private
static node reverse
(node node,
int begin,
int end)
bnode = cur;
cur = cur.next;
} enode = cur;
node nnode = cur.next;
// 下乙個
node nnnode = null;
// 下下個
// 進行反轉
for(
int i =
0; i < end - begin; i++
) nnode = nnnode;}}
// 將反轉後的鍊錶和兩端連線
bnode.next = cur;
enode.next = nnnode;
return node;
}/**
* 列印鍊錶節點值
* @param head
*/private
static
void
printlink
(node head)
system.out.
println();}}
執行結果貼一下:
// 反轉前
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 ->
// 反轉後
0 -> 1 -> 4 -> 3 -> 2 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> 13 -> 14 ->
反轉鍊錶Java
題目 定義乙個鍊錶,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。思路 反轉鍊錶時,為了保證鍊錶不斷開,需要儲存三個引用,指向前一結點的引用,當前結點的引用,指向後一結點的引用。反轉鍊錶 public static listnode reverselist listnode head r...
Java反轉鍊錶
需要記錄原煉表中三個連續的結點 reverse first second。在每輪迭代中,從原煉表中提取結點first並將它插入到逆鍊錶的開頭。同時需要一直保持first指向原煉表中所有剩餘結點的首節點,second指向原煉表中所有剩餘結點的第二個結點,reverse指向結果鍊錶中的首結點。publi...
演算法 鍊錶反轉和鍊錶內指定區間反轉
鍊錶反轉 輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。例如 輸入,返回。public listnode reverse listnode head return temp 鍊錶內指定區間反轉 將乙個鍊錶 m 位置到 n 位置之間的區間反轉,要求時間複雜度o n 空間複雜度o 1 例如 給出的鍊錶為 ...