韋到頭打印鏈表 鏈表結構之單鏈表

題目描述

輸入一個鏈表,從尾到頭打印鏈表每一個節點的值。
輸入描述:
輸入爲鏈表的表頭


輸出描述:
輸出爲須要打印的「新鏈表」的表頭


/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
             ArrayList<Integer>  result= new ArrayList();
         if (listNode== null )
             return result;
         Stack<ListNode> stack= new Stack();
         stack.push(listNode);
         while (listNode.next!= null )
         {
             stack.push(listNode.next);
             listNode=listNode.next;
         }
         while (!stack.isEmpty())
         {
             ListNode node=stack.pop();
             result.add(node.val);
         }
         return result;
 
     }
}

 

 

 

 

 

鏈表結構之單鏈表

鏈表:一種數據存儲結構.學鏈表首先要搞懂數組,按朋友的話說,數組和鏈表的關係就至關於QQ2008和QQ2009.
除非要經過索引頻繁訪問各個數據,否則大多數狀況下均可以用鏈表代替數組.
鏈表部分主要要涉及:單鏈表,雙端鏈表,有序鏈表,雙向鏈表和有迭代器的鏈表(迭代器是用來隨機訪問鏈表元素的一種方法).
因爲之前貪玩數據結構沒上課,如今後悔因此要努力補上.

鏈結點:在 鏈表中,每一個數據項都被包含在"鏈結點"(Link)中.一個鏈結點是某個類的對象,這個類能夠叫Link.而每一個Link對象中又包含着一個對下一個鏈 結點引用的字段(一般叫next).可是鏈表(LinkList)自己的對象中有一個字段(first)指向第一個鏈結點的引用.看圖會清晰些.
這張表體如今代碼裏就兩個構造類:
Link(鏈結點類)
複製代碼
class Link {
    public int iData;
    public double dData;
    public Link next; // 這個next就是鏈結點對象對下個連接點的引用.默認初始化爲NULL
    public Link(int id, double dd){
        iData = id;
        dData = dd;
    }
}
複製代碼
LinkList(鏈表類)
複製代碼
class LinkList {
    public Link first; // 首鏈結點first,初始化爲NULL
    public  LinkList () {
        first = null;
    }
}
複製代碼
就這樣一個鏈結點指向下個鏈結點的引用構成了整個鏈表.
今天這個實例,顯示了一個單鏈表.主要的操做以下:
在鏈表頭插入一個數據項.
在鏈表頭刪除一個數據項.
遍歷鏈表顯示內容.
首先插入一個連接點
的邏輯就是:將first的引用指向Link對象鏈結點的next引用,而後再將first指向這個鏈結點就構造了新的鏈表.如圖

代碼大框以下:
public void insertFirst(int id, double dd) {
    Link newLink = new Link(id, dd); // 構造新的鏈結點對象
    newLink.next = first; // 將鏈結點對象的next指向first的引用
    first = newLink;      // 而後將first指向newLink對象
}
刪 除一個鏈結點的邏輯就是:用一個臨時變量存儲first的引用(即要刪除的鏈結點)而後將first指向first.next(即他只想的鏈結點對象的 next指向的那個鏈結點Link).這樣要刪除的那個鏈結點就沒有了指針對他的引用.Java垃圾回收就會把他收回.實現了並返回存儲的那個刪除節點. 如圖
代碼大框以下:
public Link deleteFirst() {
    Link temp = first; // 暫存first引用的這個鏈結點(即要刪除的)
    first = first.next;// 將first指向他所引用的Link連接點的next引用
    return temp;       // 返回要刪除的鏈結點
}

這要弄清了,Java對象引用的關係理解起來就很容易了.下面就是實現的整個代碼:html

Code

打印的結果爲:java

複製代碼
List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88}
{88,88.88}  Deleted
{66,66.88}  Deleted
{44,44.88}  Deleted
{22,22.88}  Deleted
List: (first ---> last)
複製代碼

繼續擴展下添加查找對應鍵值和按對應鍵值刪除鏈結點的find和delete方法.
find方法:
這個方法與上面的displayLink方法相似.將current定義爲first,經過不斷的current.next.iData與鍵值做比較,若是相等便返回當前引用.
若是一直到最後Null也沒找到就返回Null
delete方法:
這個方法須要兩個變量.current:當前鏈結點的引用 privious:前一鏈結點的引用.這個方法也是經過循環查找若是找到了
.就用前一引用的next指向當前的next的引用就能夠了.見圖

最後代碼:node

Code

執行結果:數組

List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88}
the Find Item: {22,22.88}  the Del Item: {22,22.88}
List: (first ---> last){88,88.88}{66,66.88}{44,44.88}
相關文章
相關標籤/搜索