閱讀本篇文章大約花費您4~5分鐘!
鍊錶是非常重要的一種資料結構,插入和刪除的效率都是o(1),但是查詢的效率比較低是o(n)。在單鏈表中,經常會遇到逆序單鏈表的題目,雖然聽起來很簡單,但是要想完整無誤的寫出**,還是有很多細節要注意的。
今天給大家介紹兩個思路來分析這個問題。
首先我們要知道單鏈表逆序的本質就是將節點的next指標指向它的前乙個節點;並且完成逆序操作,至少要知道三個節點才可以。這是我們繼續分析的基石。
假設有乙個單鏈表(節點數為4個),三個節點的引用分別為p1,p2,p3;
思路一的思想是知道三個節點,核心操作為p2.next=p1,然後三個節點依次向後移動,結束後再修改頭指標head。
結束的條件是p2==null。
我們可以用圖示的形式看一下這個過程:
結束後再將頭的next指向p1即可。
這種方法有乙個問題,也體現在圖中,在頭兩個節點間存在了環,因此遍歷時可能出現死迴圈,在**中應該將第乙個節點的next置為null。
/*單鏈表節點類*/
public class singlynode
public singlynode(t data)
public singlynode(t data,singlynodenext)
@override
public string tostring()
}
/*單鏈表逆序*/
public singlylist reverse(singlylistlist)
singlynodep1=list.head.next;
singlynodep2=list.head.next.next;
singlynodep3=null;
while(p2!=null)
p1=p2;
p2=p3;
} list.head.next=p1;
return list;
}
第二個思路和第乙個思路的不同之處在於不改變head和p1的引用,每次都直接將p2插入到head之後,也不會出現環,實現的原理如下圖:
這種方法的指標的指向比第一種稍微複雜一點,但是不會出現上面的環,並且head和p1都不會改變,只需要改變p2,p3即可。
這種方法需要注意指標的操作順序。
**如下:
/*單鏈表逆序*/
public singlylist reverse(singlylistlist)
singlynodep1=list.head.next;
singlynodep2=list.head.next.next;
singlynodep3=null;
while(p2!=null)
return list;
}
以上就是單鏈表的逆序的思路,歸根到底要記住逆序的本質,以及要充分理解指標指向的順序和含義。
希望大家面對單鏈表逆序的問題都能夠順序快速正確的解決!
單鏈表反轉 逆序的兩種方法
摘自 延伸閱讀 此文章所在專題列表如下 第01話 線性表的概念與定義 第02話 線性表的抽象資料型別adt定義 第03話 線性表的順序儲存結構 第04話 線性表的初始化 第05話 線性表的遍歷 插入操作 第06話 判斷線性表是否為空與置空操作 第07話 線性表的查詢操作 第08話 線性表刪除某個元素...
單鏈表建立的兩種方式
建立單鏈表 單鏈表就是一種特殊的結構體組合而成的資料結構,關於單鏈表的建立方式有很多種,大同小異。在這裡我們將詳細的介紹一下頭插法建立鍊錶和尾插法建立鍊錶。如上所示單鏈表就是由可能不連續的資料所組合而成的資料結構。其中每個資料分為兩部分,一部分是資料儲存的位置,稱為資料域 data 另外指標所儲存的...
關於單鏈表的兩種建立方式
第一種方式是將新建立的單鏈表結點加在煉表頭,這種方式要注意的是最先輸入的值是這個鍊錶尾的值 在 new linknode2 new linknode 1 第二種方式是將新建立的單鏈表結點加在鍊錶尾 include include typedef int datatype typedef struct...