天天看點

兩種方法反轉單連結清單

 java代碼

兩種方法反轉單連結清單
兩種方法反轉單連結清單
兩種方法反轉單連結清單

/**

* @author luochengcheng

* 定義一個單連結清單

*/

class node {

//變量

private int record;

//指向下一個對象

private node nextnode;

public node(int record) {

super();

this.record = record;

}

public int getrecord() {

return record;

public void setrecord(int record) {

public node getnextnode() {

return nextnode;

public void setnextnode(node nextnode) {

this.nextnode = nextnode;

* 兩種方式實作單連結清單的反轉(遞歸、普通)

* 新手強烈建議旁邊拿着紙和筆跟着代碼畫圖(便于了解)

public class reversesinglelist {

* 遞歸,在反轉目前節點之前先反轉後續節點

public static node reverse(node head) {

if (null == head || null == head.getnextnode()) {

return head;

node reversedhead = reverse(head.getnextnode());

head.getnextnode().setnextnode(head);

head.setnextnode(null);

return reversedhead;

* 周遊,将目前節點的下一個節點緩存後更改目前節點指針

*

public static node reverse2(node head) {

if (null == head) {

node pre = head;

node cur = head.getnextnode();

node next;

while (null != cur) {

next = cur.getnextnode();

cur.setnextnode(pre);

pre = cur;

cur = next;

//将原連結清單的頭節點的下一個節點置為null,再将反轉後的頭節點賦給head

head = pre;

public static void main(string[] args) {

node head = new node(0);

node tmp = null;

node cur = null;

// 構造一個長度為10的連結清單,儲存頭節點對象head

for (int i = 1; i < 10; i++) {

tmp = new node(i);

if (1 == i) {

head.setnextnode(tmp);

} else {

cur.setnextnode(tmp);

cur = tmp;

//列印反轉前的連結清單

node h = head;

while (null != h) {

system.out.print(h.getrecord() + " ");

h = h.getnextnode();

//調用反轉方法

head = reverse2(head);

system.out.println("\n**************************");

//列印反轉後的結果

while (null != head) {

system.out.print(head.getrecord() + " ");

head = head.getnextnode();

}    

繼續閱讀