黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java數據結構之雙向鏈表

Java數據結構之雙向鏈表

更新時間:2019-08-21 13:59:11 來源:動力節點 瀏覽2306次

  


一、概述:


  1、什么時雙向鏈表:


  鏈表中的每個節點即指向前面一個節點,也指向后面一個節點,就像丟手絹游戲一樣,每個人都手拉手


1566366842693333.png

  

  2、從頭部插入


  要對鏈表進行判斷,如果為空則設置尾節點為新添加的節點,如果不為空,還要設置頭節點的一個前節點為新節點

  

1566366870530502.png 


  

3、從尾部進行插入


  如果鏈表為空,則直接設置頭節點為新添加的節點,否則設置尾節點的后一個節點為新添加的節點。同時設置新添加的節點的前一個節點為尾節點


1566366918124687.png

  

  4、從頭部刪除


  判斷節點是否有下個節點,如果沒有則設置節點為null,并且刪除下個節點指向前節點的指針



  5、刪除尾部節點

  如果頭節點沒有其它節點,把尾節點設置為Null。否則設置尾節點前一個節點的next為Null。設置尾節點為前一個節點


1566366978744272.png

   

  6、刪除方法


  此時不需要記錄last的Node


  刪除時使用current.previous.next= current.next;



二、實現



package com.struct.linklist;

 

/**

 * @描述         雙向鏈表

 * @項目名稱      Java_DataStruct

 * @包名         com.struct.linklist

 * @類名         LinkList

 * @author      chenlin

 * @date        2010年6月26日 上午8:00:28

 * @version     1.0 

 */

 

public class DoubleLinkList {

 

    //頭

    private Node first;

    //尾

    private Node last;

 

    public DoubleLinkList(){

        first = null;

        last = null;

    }

 

    /**

     * 插入數據

     * @param value

     */

    public void insertFirst(long value){

        Node newNode = new Node(value);

        if (first == null) {

            last = newNode;

        }else {

            first.previous = newNode;

            //把first節點往下移動

            newNode.next = first;

        }

        //把插入的節點作為新的節點

        first = newNode; 

    }

 

    /**

     * 插入數據

     * @param value

     */

    public void insertLast(long value){

        Node newNode = new Node(value);

        if (first == null) {

            first = newNode;

        }else {

            last.next = newNode;

            //first.previous = newNode;

            newNode.previous = last;

        }

        //把最后個節點設置為最新的節點

        last = newNode;

    }

 

    public boolean isEmpty(){

        return first == null;

    }

 

    /**

     * 刪除頭節點時要去除兩個指針,一個指向下個的next ,一個是next的previous指向前面的

     * 

     * @param value

     * @return

     */

    public Node deleteFirst(){

        if (first == null) {

            throw new RuntimeException("鏈表數據不存在");

        }

        Node temp = first;

        if (first.next == null) {

            last = null;

        }else {

            first.next.previous = null;

        }

        first = temp.next;

        return temp;

    }

 

    /**

     * 刪除頭節點時要去除兩個指針,一個指向下個的next ,一個是next的previous指向前面的

     * 

     * @param value

     * @return

     */

    public Node deleteLast(){

        if (first == null) {

            throw new RuntimeException("鏈表數據不存在");

        }

 

        Node temp = last;

        if (first.next == null) {

            last = null;

            //把第一個刪除

            first = null;

        }else {

            last.previous.next = null;

        }

        last = temp.previous;

        return temp;

    }

 

    /**

     * 刪除

     * @param key

     * @return

     */

    public Node deleteByKey(long key){

        Node current = first;

        while(current.data != key){

            if (current.next == null) {

                System.out.println("沒找到節點");

                return null;

            }

            current = current.next;

        }

        if (current == first) {

            //return deleteFirst();

            //指向下個就表示刪除第一個

            first = first.next;

        }else {

            current.previous.next = current.next;

        }

        return current;

    }

 

    /**

     * 顯示所有的數據

     */

    public void display(){

        if (first == null) {

            //throw new RuntimeException("鏈表數據不存在");

            return;

        }

        Node current = first;

        while(current != null){

            current.display();

            current = current.next;

        }

        System.out.println("---------------");

    }

 

    /**

     * 查找節點1

     * @param value

     * @return

     */

    public Node findByValue(long value){

        Node current = first;

        while(current != null){

            if (current.data != value) {

                current = current.next;

            }else {

                break;

            }

        }

        if (current == null) {

            System.out.println("沒找到");

            return null;

        }

        return current;

    }

 

    /**

     * 查找節點2

     * 

     * @param key

     * @return

     */

    public Node findByKey(long key) {

        Node current = first;

        while (current.data != key) {

            if (current.next == null) {

                System.out.println("沒找到");

                return null;

            }

            current = current.next;

        }

        return current;

    }

 

    /**

     * 根據索引查找對應的值

     * @param position

     * @return

     */

    public Node findByPosition(int position){

        Node current = first;

        //為什么是position - 1,因為要使用遍歷,讓current指向下一個, 所以position - 1的下個node就是要找的值

        for (int i = 0; i < position - 1 ; i++) {

            current  = current.next;

        }

        return current;

    }

 

 

    public static void main(String[] args) {

        DoubleLinkList linkList = new DoubleLinkList();

        linkList.insertFirst(21);

        linkList.insertFirst(22);

        linkList.insertFirst(23);

        linkList.insertLast(24);

        linkList.insertLast(25);

        linkList.insertLast(26);

        linkList.insertLast(27);

 

        linkList.display();

 

        System.out.println("---查找-------------------------------------");

 

        linkList.findByKey(25).display();

 

        System.out.println("--刪除first-------------------------------------");

 

        //linkList.deleteFirst().display();

        ///linkList.deleteFirst().display();

        //linkList.deleteFirst().display();

        //linkList.deleteFirst().display();

 

        System.out.println("-刪除指定值---------------------------------------");

        linkList.deleteByKey(27).display();

        linkList.deleteByKey(21).display();

 

        System.out.println("----------------------------------------");

        linkList.display();

 

 

    }

}


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 手机看片日韩国产一区二区 | 91视频免费网站 | 91视频 88av| 日韩欧美视频一区二区 | 国产高清在线精品免费 | 亚洲第一二三四区 | 激情久久久久久久久久 | 欧美极品video粗暴 | 国产特黄特色a级在线视频 国产特黄特色a级在线视 | 欧美日韩视频精品一区二区 | 久操视频免费看 | 亚洲日本一区二区三区高清在线 | 亚洲日本高清成人aⅴ片 | 日韩精品一区二区三区高清 | 五月激情六月婷婷 | 老司机午夜视频 | 国外欧美一区另类中文字幕 | 欧美人人做人人爽人人喊 | 男女午夜视频 | 一本大道道无香蕉综合在线 | 亚洲精品456在在线播放 | 极品嫩模众筹福利写真视频 | 亚洲国产欧美无圣光一区 | 综合五月网 | 成人免费精品视频 | 一级一黄在线观看视频免费 | 中文字幕在线观看一区二区 | 一个人看www在线高清免费看 | 欧洲精品在线视频 | 欧美激情αv一区二区三区 欧美激情xxxx | 五月婷婷综合激情 | 欧美日韩在线看 | 热热涩热热狠狠色香蕉综合 | 久草免费在线播放 | 91福利免费体验区观看区 | 久久久精品免费视频 | 天天干天天拍天天射天天添天天爱 | 国产特级毛片aaaaaaa高清 | 日韩欧美中文字幕在线播放 | 欧美在线一二三 | 国产aⅴ片 |