JAVA數據結構 - 雙向鏈表

 1.雙向鏈表增刪改    直接找到該節點即可,因爲有pre可以找到上一個

  2.設置 新插入節點時,  Next:  先設置   newHead的  next      Pre :   先設置 原來節點的前一個   指向新節點

static class HeroNodeD {
        private int number;
        private String name;
        private String nickName;
        private HeroNodeD next;   指向下一個
        private HeroNodeD pre;    指向上一個

        public HeroNodeD(int number, String name, String nickName) {
            this.number = number;
            this.name = name;
            this.nickName = nickName;
}}

一.直接向最後添加

        * 向 雙向鏈表最後添加
        public void add(HeroNodeD headNode) {
            HeroNodeD tmp = HeadNode; //定一個臨時變量指向頭結點
            while (true) {
                if (tmp.next == null) {  //如果頭結點的下一位爲空,那麼將傳入的節點設置爲它的下一位
                    tmp.next = headNode;
                    headNode.pre=tmp;     設置插入的head的前一位
                    break;
                }
                tmp = tmp.next;    //如果不爲空,指向下一位            }}

二.順序插入

  1.與單鏈表類似,只是在需要 加入pre      2.判斷當第一個插入時,判斷  tmp.next!=null   不是最後一個 再設置它的  pre

 順序插入,並且不能重複插入已經存在的編號
        public void addByOder(HeroNodeD headNode) {
            HeroNodeD tmp = HeadNode;  //將頭結點,賦值給臨時變量,以便操作
            Boolean flag = false;      //表示要插入的節點是否存在
            while (true) {
                if (tmp.next == null) {  //已經最後一個了,直接插入
                    break;
                }
                if (tmp.next.number > headNode.number) {
                    //表示tmp的下一個大於headNode那麼headNode就插入到tmp之後就行了
                    break;
                } else if (tmp.next.number == headNode.number) {
                    flag = true;
                    break;
                }
                tmp = tmp.next;

            }
            if (flag == true) {
                System.out.printf("已經存在%d號節點,不能插入~~\n", headNode.number);
            } else {  //可以插入
                // 將headNode的下一位指向tmp的下一位
                headNode.next = tmp.next;
                if (tmp.next!=null){           //如果 tmp不是最後一個
                    tmp.next.pre = headNode;   //就將tmp.下一個的前指向  新添的這個
                }
                //將tmp的下一位指向 headNode,
                tmp.next = headNode;
                headNode.pre=tmp;                }}

三.修改節點與單鏈表一樣

四.刪除節點

    1.判斷最後一個刪除時,判斷  tmp.next!=null   不是最後一個 再設置它的  pre 

     2.直接找到刪除節點      tmp.pre.next = tmp.next;          tmp.next.pre=tmp.pre;

        public void delete(int number) {
            Boolean flag = false;  //表示是否找到該節點
            HeroNodeD tmp = HeadNode.next;

            while (true) {
                if (tmp == null) {
                    break;
                }
                if (tmp.number == number) {  //找到該編號的上一個節點
                    flag = true;
                    break;
                }
                tmp = tmp.next;
            }

            if (flag) {
                tmp.pre.next = tmp.next;
                if (tmp.next!=null){
                    tmp.next.pre=tmp.pre;
                }
            } else {
                System.out.printf("不存在該%d號節點\n", number);    }}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章