1. 程式人生 > >java連結串列初步學習

java連結串列初步學習

java中的連結串列和  c/c++  一樣,也是一種線性資料結構。和陣列的功能有一定的相似,但是兩者之間在某些方面還是存在很大的不同,簡單的來說不同點有以下幾點:

1.在建立陣列時,是一次性地開闢一整塊記憶體空間,所有陣列元素都是放在裡面,必須說明陣列的固定長度。而連結串列可以先建立一個連結串列頭(實際就是第一個結點),在需要的時候動態地新增(擴充套件連結串列)

2.陣列的資料是按照元素順序連續地儲存在記憶體中的,定位陣列中的資料只要知道其在陣列中的位置就行。連結串列是以結點為單位的,在儲存資料時並不是連續存放的,除卻資料外,還另外包含指向下一節點的指標,訪問資料時總是需要從連結串列頭開始

3.對陣列元素進行插入,刪除,修改時需要對陣列元素進行大規模的移動,而連結串列避免了這樣的情況。

連結串列是以結點為單位的,我們需要首先定義宣告連結串列中的結點類

class Node{//先建立一個節點類
    private int m_Data;
    private Node  m_Next;
    Node(int data){//只有一個節點
    m_Data=data;
    m_Next=null;
    }
    Node(int data,Node next){//包含多個節點,必須定義指標
        m_Data=data;
        m_Next=next;
    }
    int getData(){
        return m_Data;
    }
    void setData(int data){
        m_Data=data;
    }
    Node  getNext(){
        return m_Next;
    }
    void setNext(Node next){
        m_Next=next;
    }
}

以下是一些關於建立連結串列,遍歷連結串列,插入,刪除連結串列相關結點的操作:
class Linklist{
    Node m_FirstNode;//定義第一個節點
    Linklist(){
        m_FirstNode=null;
    }//第一個建構函式,第一個節點就是為空的,說明是個空連結串列
    Linklist(int data){
        m_FirstNode=new Node(data);
    }//建立一個只有一個節點的連結串列,因為沒有宣告指標
    String visitAllNode(){
        Node  next=m_FirstNode;
        String s="";
        while (next!=null){
            s=s+next.getData();
            next=next.getNext();
        }
        return s;
    }//遍歷所有的節點,定義宣告next是為了不影響第一個節點
    void insertAfterId(int data,int id){
        Node next =m_FirstNode;
        if(next==null){
            m_FirstNode=new Node(data);
        }
        else
        {
            while(next.getNext()!=null&&next.getData()!=id)
                next=next.getNext();
            next.setNext(new Node(data,next.getNext()));
        }
    }//在指定的id位置上插入
    boolean removeAtId(int id){
        Node ahead=m_FirstNode;
        Node follow=ahead;
        if(ahead==null)
            return false;
        else if(ahead.getData()==id)
        {
            m_FirstNode=m_FirstNode.getNext();
            return true;
        }
        else{
            ahead=ahead.getNext();
            while(ahead!=null){
                if(ahead.getData()==id){
                    follow.setNext(ahead.getNext());
                    return true;
                }
                follow=ahead;
                ahead=ahead.getNext();
            }
            return false;
        }
    }
    void removeAll(){
        m_FirstNode=null;
    }
}