1. java怎麼用鏈表實現
在數據結構中經常看見的一個基本概念-鏈表。
鏈表是一種物理存儲單元上非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
在Java中,對於鏈表的實現都是基於引用數據類型操作的。實現大致如下:
定義節點類Node,節點的概念很重要,一個鏈表是由各各節點連接在一起組成的。在節點類Node中定義節點內容及指向下一節點的引用,再增加一個添加節點的方法即可完成鏈表實現。
鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。在執行效率上,相比數組而言,鏈表插入快查找慢,開發中得根據實際業務使用。
2. Java語言沒有指針,怎樣實現鏈表
Java語言中的對象引用實際上是一個指針(這里的指針均為概念上的意義,而非語言提供的數據類型),所以我們可以編寫這樣的類來實現鏈表中的結點。
程序代碼:
classNode
{
Objectdata;
Nodenext;//指向下一個結點
}
將數據域定義成Object類是因為Object類是廣義超類,任何類對象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結點的指針和指向當前結點的指針。為了便於在鏈表尾部增加結點,還可以增加一指向鏈表尾部的指針,另外還可以用一個域來表示鏈表的大小,當調用者想得到鏈表的大小時,不必遍歷整個鏈表。
鏈表的數據結構我們可以用類List來實現鏈表結構,用變數Head、Tail、Length、Pointer來實現表頭。存儲當前結點的指針時有一定的技巧,Pointer並非存儲指向當前結點的指針,而是存儲指向它的前趨結點的指針,當其值為null時表示當前結點是第一個結點,因為當刪除當前結點後仍需保證剩下的結點構成鏈表,如果Pointer指向當前結點,則會給操作帶來很大困難。如何得到當前結點呢?我們定義了一個方法cursor(),返回值是指向當前結點的指針。類List還定義了一些方法來實現對鏈表的基本操作,通過運用這些基本操作我們可以對鏈表進行各種操作。例如reset()方法使第一個結點成為當前結點。insert(Object d)方法在當前結點前插入一個結點,並使其成為當前結點。remove()方法刪除當前結點同時返回其內容,並使其後繼結點成為當前結點,如果刪除的是最後一個結點,則第一個結點變為當前結點。
鏈表類List的源代碼如下:
packagecn.javatx;importjava.io.IOException;/**
*@authorljfan
*
*/
publicclassList{
privateNodeHead=null;
privateNodeTail=null;
privateNodePointer=null;
privateintLength=0;publicvoiddeleteAll(){
Head=null;
Tail=null;
Pointer=null;
Length=0;
}publicvoidreset(){
Pointer=null;
}publicbooleanisEmpty(){
return(Length==0);
}publicbooleanisEnd(){
if(Length==0)
thrownewjava.lang.NullPointerException();
elseif(Length==1)
returntrue;
else
return(cursor()==Tail);
}publicObjectnextNode(){
if(Length==1)
thrownewjava.util.NoSuchElementException();
elseif(Length==0)
thrownewjava.lang.NullPointerException();
else{
Nodetemp=cursor();
Pointer=temp;
if(temp!=Tail)
return(temp.next.data);
else
thrownewjava.util.NoSuchElementException();
}
}publicObjectcurrentNode(){
Nodetemp=cursor();
returntemp.data;
}publicvoidinsert(Objectd){
Nodee=newNode(d);
if(Length==0){
Tail=e;
Head=e;
}else{
Nodetemp=cursor();
e.next=temp;
if(Pointer==null)
Head=e;
else
Pointer.next=e;
}
Length++;
}publicintsize(){
return(Length);
}publicObjectremove(){
Objecttemp;
if(Length==0)
thrownewjava.util.NoSuchElementException();
elseif(Length==1){
temp=Head.data;
deleteAll();
}else{
Nodecur=cursor();
temp=cur.data;
if(cur==Head)
Head=cur.next;
elseif(cur==Tail){
Pointer.next=null;
Tail=Pointer;
reset();
}else
Pointer.next=cur.next;
Length--;
}
returntemp;
}privateNodecursor(){
if(Head==null)
thrownewjava.lang.NullPointerException();
elseif(Pointer==null)
returnHead;
else
returnPointer.next;
}publicstaticvoidmain(String[]args){
Lista=newList();
for(inti=1;i<=10;i++)
a.insert(newInteger(i));
System.out.println(a.currentNode());
while(!a.isEnd())
System.out.println(a.nextNode());
a.reset();
while(!a.isEnd()){
a.remove();
}
a.remove();
a.reset();
if(a.isEmpty())
System.out.println("ThereisnoNodeinListn");
System.out.println("Youcanpressreturntoquitn");
try{
System.in.read();
}catch(IOExceptione){
}
}
}classNode{
Objectdata;
Nodenext;Node(Objectd){
data=d;
next=null;
}
}
當然,雙向鏈表基本操作的實現略有不同。鏈表和雙向鏈表的實現方法,也可以用在堆棧和隊列的現實中。
3. JAVA中數組與鏈表有什麼區別
數組與鏈表在計算機科學中是兩種常見的數據結構,它們各自具有不同的特點和用途。
數組是一種有序的元素序列,將具有相同類型的多個元素集合在一起進行命名,這些元素在物理存儲上是連續的。這意味著數組中的所有元素都具有相同的數據類型,並且可以通過索引快速訪問,但數組的大小在創建時就需要確定,不能動態調整。
相比之下,鏈表則是一種非連續的存儲結構,它由一系列結點組成,每個結點包含數據部分和指向下一個結點的指針。鏈表中的結點可以在運行時動態生成,因此可以靈活地添加或刪除結點,而不像數組那樣需要預先知道數據的大小。
鏈表的優勢在於它能有效利用內存空間,特別是在數據大小不確定或需要頻繁添加或刪除數據的情況下。鏈表的這種特性使得它在動態數據管理方面具有獨特的優勢。
數組和鏈表之間的主要區別還體現在它們的實現方式上。數組中的元素是連續存儲的,因此可以利用索引來快速訪問元素。而鏈表則通過指針鏈接各結點,這種方式使得鏈表更適合處理動態數據。
綜上所述,數組和鏈表在不同的應用場景中都有其獨特的優勢,選擇哪種數據結構取決於具體的需求和場景。
4. Java鏈表ListNode的理解與操作技巧
深入理解Java鏈表——ListNode的奧秘與高效操作
鏈表,這位數據結構的低調明星,與數組並肩存在,但實現原理卻大相徑庭。Java中,ArrayList依託數組,而LinkedList則依託鏈表。鏈表的一大優勢在於數據的動態添加和刪除,但循環遍歷效率卻不如數組。它是一個由節點(Node)串聯而成的線性結構,內存中的數據分布不連續,每個節點持有自己的數據和對下一個節點的引用,形成了鏈式連接。鏈表的主角——單向鏈表,僅有一個頭節點(Head),所有的操作都是通過它進行的,無論是插入還是刪除。
想像一下,就像一個看不見的線索,每個節點都持有指向下一個節點的線索,上圖中,頭節點就像這個鏈條的起點。有趣的是,添加節點的過程卻從鏈尾開始,新節點被插入到當前尾節點之後,形成一個不斷擴展的序列。每個節點都僅知道自己下一個節點的位置,這就是鏈表的魅力所在。
節點的構造精巧,由對象值(val或data)和指向下一個節點的引用(Node.next)構成,就像一個信息傳遞的接力賽,每個節點都承載著數據和傳遞的使命。以下是ListNode的精簡版定義:
在MyList類中,鏈表的操作方法更是精細入微。添加節點(add)、刪除指定節點(delete)、獲取節點長度(size)、查找節點位置(find),以及通過下標獲取節點(get),每個方法都展示了鏈表操作的靈活性和高效性。比如,delete方法通過遍歷鏈表找到目標節點,然後更新節點連接,避免了數組需要移動大量元素的麻煩。
最後,別忘了鏈表還有個華麗轉身的時刻——鏈表反轉(reverse)。通過交換每個節點的前後節點,鏈表從頭到尾的順序來了個180度的大轉彎,展示了鏈表操作的多樣性和可能性。
鏈表,這個看似平凡的數據結構,實則蘊含著豐富的操作技巧和靈活性。通過熟練掌握ListNode,你將能在Java編程世界中游刃有餘地處理各種數據操作,讓代碼更加高效且優雅。
5. 求用Java寫的:輸入N個整數,按照輸入的順序建立單鏈表存儲,並遍歷所建立的單鏈表,輸出這些數據。
importjava.util.Scanner;
publicclassNode{
publicintvalue;
publicNodenext;
publicNode(intvalue){
this.value=value;
this.next=null;
}
publicvoidadd(Nodenode){
this.next=node;
}
publicbooleanhasNext(){
returnthis.next==null?false:true;
}
publicstaticvoidmain(String[]args){
Nodefirst=null;//記錄第一個節點,在後面遍歷的時候使用
Nodenode=null;//保存當前輸入的節點使用
Scannerin=newScanner(System.in);//用於控制台輸入,Ctrk+Z結束輸入
while(in.hasNext()){
intv=in.nextInt();
Noden=newNode(v);
if(first==null){
first=n;
node=n;
}else{
node.add(n);
node=n;
}
}
if(first==null){
System.out.println("沒有數字輸入");
}else{
node=first;
System.out.println(node.value+"");
while(node.hasNext()){
node=node.next;
System.out.println(node.value+"");
}
}
}
}
模擬最簡單的單鏈表,臨時手打,僅供做題等參考,望採納。