什么是有序鏈表
一堆數據中,每一個數據項都持有下一個數據項的引用.這種被串聯起來的數據結構叫做鏈表.鏈表中的數據項按照某種順序排列起來的數據結構叫做有序鏈表.
有序鏈表的代碼實現
數據結構中必須具備插入數據項的功能,有序鏈表中相對復雜的就是插入數據項了.為了能在有序列表中插入數據項,算法必須首先搜索整個鏈表,直到適合的位置.它恰好在第一個比它大的數據項前面.當算法找到了需要插入的位置,就把新數據項中next字段指向下一個鏈接點,然后把上一個鏈接點的next字段指向新的鏈接點.那么在插入算法中就需要有兩個字段:
一個為保留當前鏈接點,另外一個保留下一個鏈接點,這樣才能插入新鏈接點.
然而需要考慮一個特殊情況: 新鏈接點有可能插入在表頭
有兩種可能需要在表頭插入新鏈接點,一種是鏈表為空,一種是新鏈接點比鏈表表頭數據項小.當出現這種情況就直接把新鏈接點賦值給鏈表.
最后將新鏈接點的下一個引用指向鏈表
具體代碼實現
class Link{ public int iData; public Double dData; public Link next; public Link(int iData,Double dData) { this.iData = iData; this.dData = dData; this.next =null; } public void display() { System.out.println(iData+" , " + dData); } } class OrderedLink{ private Link first; public OrderedLink() { this.first = null; } public boolean isEmpty() { return first==null; } /** * 有序鏈表添加鏈結點實現方案 * 插入新鏈結點需要查找整個鏈表,找到第一個比新鏈結點大的結點位置. * 將新鏈結點的next 指向下一個鏈結點.將上一個鏈結點的next指向 * 新的鏈結點. * * @param iData */ public void insertLink(int iData,double dData) { Link newLink = new Link(iData,dData);//新鏈結點 Link persious = null; //上一個鏈接點 Link currentLink = first; //當前鏈接點 //當前鏈接點不為空,且新鏈接點大於當前鏈接點.當前鏈接點往后挪一個結點 //並保留上一個鏈接點 while(currentLink!=null && iData>currentLink.iData) { persious = currentLink; currentLink = currentLink.next; } //如果上一個鏈結點為空.只有當前鏈表為空或者新鏈接點大於當前鏈接點時才會出現這種情況 //將新鏈接點賦值鏈表 if(persious==null) { first = newLink; }else { persious.next =newLink; //新鏈接點賦值給上個鏈接點的下個引用 } newLink.next = currentLink; //新鏈接的下個引用等於當前鏈接點 } public void displayList() { Link current = first; while(current!=null) { current.display(); current = current.next; } } }