package com.hnust.reversal;
public
class listnode
public
listnode(int
value, listnode next)
@override
public string tostring()
}
我們可以通過把鍊錶中鏈結節點的指標反轉過來,從而改變鍊錶的方向,以下兩種演算法是其實現。還有一種方法就是通過 棧 來實現:從頭到尾遍歷鍊錶,依次將鍊錶元素壓入棧中,然後依次彈棧,從而實現鍊錶的反轉。1)三個指標變數:
pre:前驅結點
p:當前結點
next:下乙個結點
2)關鍵的四個步驟:next = p.next;//將當前結點的下乙個結點,用next存起來
p.next = pre;//將當前結點的next指標指向前驅結點pre(反轉單個結點)
pre = p;//把p作為前驅結點(即 將pre結點往後移動一位)
p =next;//把next作為當前結點(即將p結點往後移動一位)
3)反轉圖示:
1)三個指標變數:
p:當前結點
tatil:尾部結點
2)遞迴處理next
next.next=p;
返回尾部結點
3)反轉圖示:
/** * 反轉鍊錶
*@author administrator
* */
public
class
reversal
system.out.println();
}//將陣列轉換成鍊錶
public listnode arraytolist(int array)
return head.next;
}/**
* 反轉鍊錶(非遞迴演算法)
* */
public listnode reverselist(listnode head)else
head.next = null;//迴圈結束之後,去掉鍊錶環
//返回前驅結點pre,作為新的頭結點(因為while迴圈結束的條件是p==null,所以根據最後一次的迴圈得出 最後只有
//pre是指向最後乙個結點的,所以將pre作為新的頭結點)
return pre;}}
/*** 遞迴方法,時間複雜度和空間複雜度都是o(n)
*/public listnode recursive(listnode p)else
}public listnode reverselistrecursive(listnode head)else
}@test
public
void
test01();
listnode head = arraytolist(array);
printlist(head);
listnode newhead =reverselist(head);
printlist(newhead);
}@test
public
void
test02();
listnode head = arraytolist(array);
printlist(head);
listnode newhead =reverselistrecursive(head);
printlist(newhead);}}
通過棧實現鍊錶的反轉
stack
stack
=new
stack
();public listnode reverse(listnode head)
listnode newhead =
null; //新的頭結點
if (!
stack
.empty())
listnode p1 = newhead;
while (!
stack
.empty())
return newhead;
}
鍊錶 反轉鍊錶
問題 兩兩交換鍊錶中的節點 問題 k 個一組翻轉鍊錶 問題鏈結 利用棧先進後出的特性,遍歷鍊錶,將每個結點加入棧中,最後進行出棧操作,先出棧的結點指向臨近的後出棧的結點。definition for singly linked list.struct listnode class solution ...
鍊錶 反轉單向鍊錶
思路 從第二個元素開始。1 刪除當前元素。2 把當前元素放到頭結點位置。其中需要宣告3個變數 headnode 頭結點 prenode 前乙個結點 currentnode 當前結點 具體步驟如圖所示 實現 反轉單鏈表方法實現類 created by liujinjin on 17 1 19.publ...
反轉鍊錶與分組反轉鍊錶
經典的反轉鍊錶,先上 public class listnode public class printlist system.out.println public class reverse public listnode reverse listnode root listnode pre nul...