下载麻将游戏免费|手机麻将游戏

雙向鏈表的基本操作: java語言實現

飛來科技  發布時間:2019-08-22 16:02:25

本文關鍵詞:c語言雙向鏈表的基本操作

管理系統c語言鏈表_c語言教程 鏈表_c語言雙向鏈表的基本操作

本文鏈接:

單向遞歸包括兩個域,一個是信息域,一個是指針域。為什么應該雙向鏈表c語言雙向鏈表的基本操作,因為在實際的工程項目當中,有時候為了提升單向遞歸訪問節點元素的強度,需要在數組結點元素中減少一個指向前驅的指針,提高對數組元素節點的訪問速率。鏈表中最簡潔的一種是單向遞歸,它包括兩個域,一個信息域和一個指針域。

previous域--存放結點的直接前驅的地址(位置)的指針域

管理系統c語言鏈表_c語言教程 鏈表_c語言雙向鏈表的基本操作

data域--存放結點值的數據域

next域--存放結點的直接后繼的地址(位置)的指針域

雙向鏈表的主要特點是針對任意給的節點,都可以很隨意的獲取其前節點和后結點c語言雙向鏈表的基本操作,其主要特點是每個結點應該保存next和previous兩個指針域,因此應該更多的空間開銷,同時節點的插入與刪除操作也將變得耗時,因為還要操作更多的指向操作。

管理系統c語言鏈表_c語言雙向鏈表的基本操作_c語言教程 鏈表

2.1 創建結點類

//創建一個雙向鏈表結點類,并用get,set方法獲取其數據。
public class DLLNode {
    private int data;//數據域
    private DLLNode next;//后繼指針域
    private DLLNode previous;//前驅指針域
    public DLLNode(int data) {
        this.data = data;
        this.next = null;
        this.previous = null;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public DLLNode getNext() {
        return next;
    }
    public void setNext(DLLNode next) {
        this.next = next;
    }
    public DLLNode getPrevious() {
        return previous;
    }
    public void setPrevious(DLLNode previous) {
        this.previous = previous;
    }
    //顯示該結點的數據
    public void display() {
        System.out.print( data + " ");
    }
}

2.2 創建鏈表類

c語言雙向鏈表的基本操作_管理系統c語言鏈表_c語言教程 鏈表

public class DoublyLinkedList {
    private DLLNode head;//表頭
    private int length = 0;
    public DoublyLinkedList() {
        this.head = null;
    }
    //在鏈表頭部添加結點
    public void addHead(int data) {
        DLLNode newNode = new DLLNode(data);
        if(head == null) {
            head = newNode;//如果鏈表為空,增加新結點
        }
        else {
            newNode.setNext(head);
            head.setPrevious(newNode);
            head = newNode;
        }
        length++;
    }
    //在鏈表頭部刪除結點
    public void deleteHead() {
        if(head == null){
            System.out.println("空表,刪除的結點不存在");
        }
        else {
            DLLNode curNode = head;
            head = curNode.getNext();
            head.setPrevious(null);
        }
        length--;
    }
    //在鏈表尾部添加結點
    public void addTail(int data) {
        DLLNode newNode = new DLLNode(data);
        if (head == null) {
            head = newNode;
        } else {
            DLLNode curNode = head;
            int count = 1;
            while (count < length) {
                curNode = curNode.getNext();
                count++;
            }
            newNode.setNext(null);
            newNode.setPrevious(curNode);
            curNode.setNext(newNode);
        }
        length++;
    }
    //在鏈表尾部刪除結點
    public void deleteTail() {
        if(head == null){
            System.out.println("空表,刪除的結點不存在");
        }else{
            DLLNode preNode = head;
            int count = 1;
            while(count < length-1) {
                preNode = preNode.getNext();
                count++;
            }
            preNode.setNext(null);
        }
        length--;
    }
    //正向遍歷鏈表
    public void printOrderNode() {
        if(head == null) {
            System.out.println("空表");
        }
        DLLNode curNode = head;
        while (curNode != null) {
            curNode.display();
            curNode = curNode.getNext();
        }
        System.out.println();
    }
    //反向遍歷鏈表
    public void printReverseNode() {
        if(head == null) {
            System.out.println("空表");
        }
        DLLNode curNode = head;
        while (curNode.getNext() != null) {
            curNode = curNode.getNext();
        }
        while (curNode != null) {
            curNode.display();
            curNode = curNode.getPrevious();
        }
        System.out.println();
    }
    //獲取鏈表的長度
    public int listLength() {
        return length;
    }
    //在指定位置插入結點
    public void insertList(int data, int index) {
        DLLNode newNode = new DLLNode(data);
        if(head == null){
            head = newNode;//鏈表為空,插入
        }
        if(index > length+1 || index < 1) {
            System.out.println("結點插入的位置不存在,可插入的位置為1到"+(length+1));
        }
        if(index == 1) {
            newNode.setNext(head);
            head.setPrevious(newNode);
            head = newNode;//在鏈表開頭插入
        } else{              //在鏈表中間或尾部插入
            DLLNode preNode = head;
            int count = 1;
            while(count < index-1) {
                preNode = preNode.getNext();
                count++;
            }
            DLLNode curNode = preNode.getNext();
            newNode.setNext(curNode);
            newNode.setPrevious(preNode);
            preNode.setNext(newNode);
            if(curNode != null) {
                curNode.setPrevious(newNode);
            }
        }
        length++;
    }
    //在指定位置刪除結點
    public void deleteList(int index) {
        if(index > length || index < 1) {
            System.out.println("結點刪除的位置不存在,可刪除的位置為1到"+length);
        }
        if(index == 1) {
            DLLNode curNode = head;
            head = curNode.getNext();
            head.setPrevious(null);
            length--;
        } else{
            DLLNode preNode = head;
            int count = 1;
            while(count < index-1) {
                preNode = preNode.getNext();
                count++;
            }
            DLLNode curNode = preNode.getNext();
            DLLNode laterNode = curNode.getNext();
            preNode.setNext(laterNode);
            if(laterNode != null) {  //若被刪除結點的后繼結點不是null結點,那么設置其前驅結點
                laterNode.setPrevious(preNode);//指針指向被刪除結點的前驅結點
            }
            length--;
        }
    }
    //查找數據是否存在,與單鏈表一樣
    public boolean containData(int data) {
        if(head == null){
            System.out.println("空表");
            return false;
        }
        DLLNode curNode = head;
        while(curNode.getData()!= data){
            if(curNode.getNext() == null) {
                System.out.println("結點數據不存在");
                return false;
            }
            curNode =curNode.getNext();
        }
        System.out.println("結點數據存在");
        return true;
    }
    //獲取指定位置的數據,與單鏈表一樣
    public void getIndexData(int index) {
        if(head == null){
            System.out.println("空表");
        }
        if(index > length || index < 1) {
            System.out.println("結點位置不存在,可獲取的位置為1到"+length);
        }
        DLLNode curNode = head;
        int count =1;
        while(count != index) {
            curNode =curNode.getNext();
            count++;
        }
        curNode.display();
        System.out.println();
    }
    //修改指定位置的結點數據,與單鏈表一樣
    public void updateIndexData(int index, int data) {
        if(head == null){
            System.out.println("空表");
        }
        if(index > length || index < 1) {
            System.out.println("結點位置不存在,可更新的位置為1到"+length);
        }
        DLLNode curNode = head;
        int count =1;//while也可以用for循環方式解決
        while(count != index) {
            curNode =curNode.getNext();
            count++;
        }
        curNode.setData(data);
    }
}

測試類建立如下,運行結果這里不再贅述。

public class DoublyLinkedListTest {
    public static void main(String [] args) {
        DoublyLinkedList list = new DoublyLinkedList();
        list.addHead(3);
        list.addHead(2);
        list.addHead(1);
        //list.addTail(4);
        //list.addTail(5);
        //list.addTail(6);
        //list.deleteTail();
        //list.deleteHead();
        //list.insertList(1,1);
        //list.deleteList(2);
        //list.containData(1);
        //list.getIndexData(2);
        list.updateIndexData(3,5);
        list.printOrderNode();
        list.printReverseNode();
    }
}

管理系統c語言鏈表_c語言雙向鏈表的基本操作_c語言教程 鏈表

對于鏈表特點及增、刪等操作過程及機理的把握,有助于我們寫程序實現。

[1] 數據結構與算法經典難題解析

[2]單向遞歸的基本操作: java語言實現

本文來自互聯網,由機器人自動采編,文章內容不代表本站觀點,請讀者自行辨別信息真偽,如有發現不適內容,請及時聯系站長處理。

    相關閱讀
    下载麻将游戏免费 恒达娱樂 重庆时时采彩开奖记录 斗地主怎么玩法教程 利鑫旗下 彩票平台代理 北京塞车开奖结果直播 51时时彩计划 创新平台登录入口 篮球比分直播网360 澳门澳博博彩公司官网 北京pk10走势软件