用java實現單鏈表 雙向鏈表

来源:http://www.cnblogs.com/-new/archive/2016/03/28/5315126.html
-Advertisement-
Play Games

下麵為雙向鏈表 大一菜鳥初學,有誤之處請諒解。 ...


package code;

class Node
{
    Node next;
    int data;
    public Node(int data)
    {
        this.data=data;
    }
    
}
class LinkList
{
    Node first;
    //頭部
    public LinkList()
    {
        this.first=null;
    }
    public void addNode(Node no)
    {
        no.next=first;
        first=no;//在頭部添加
    }
    public void delectNode()
    {
        Node n=first.next;
        first=null;
        first=n;//在頭部刪除
    }
    //刪除指定位置
    public int Number()
    {
        int count=1;
        //查看有多少元素
        Node nd=first;
        while(nd.next!=null)
        {
            nd=nd.next;
            count++;
        }
        return count;
    }
    public void delectExact(int n)
    {
        //刪除指定位置
        if(n>1)
        {
            int count=1;
            Node de=first;
            while(count<n-1)
            {
                de=de.next;
                count++;
                
            }
            de.next=de.next.next;
        }
        else
            first=first.next;
        
    }
    public void addExact(int n,Node nd)
    {
        if(n>1)//添加指定位置
        {
            int count=1;
            Node de=first;
            while(count<n-1)
            {
                de=de.next;
                count++;
                
            }
            nd.next=de.next;
            de.next=nd;

        }
        else
            first=first.next;
    }
    public int  findNode(int n)
    {
        int count=1;//查找一個數對應的位置
        Node de=first;
        while(de.data!=n)
        {
            de=de.next;
            count++;
            if(de==null)
            {
                return -1;
            }
        }
        return count;
    }
    public void print()
    {
        Node no=first;//列印所有
        while(no!=null)
        {
            System.out.println(no.data);
            no=no.next;
        }
    }
}
public class TextNode
{
    public static void main(String[] args)
    {
        LinkList ll=new LinkList();
        ll.addNode(new Node(12));
        ll.addNode(new Node(15));
        ll.addNode(new Node(18));
        ll.addNode(new Node(19));
        ll.addNode(new Node(20));
        /*System.out.println(ll.first.data);

        ll.delectNode();
        System.out.println(ll.first.data);*/
        System.out.println(ll.Number());
        ll.delectExact(3);
        ll.addExact(3, new Node(100));
        System.out.println(ll.Number());
//        ll.print();
        System.out.println(ll.findNode(112));
        
    }
}

下麵為雙向鏈表

public class DoubleLink
{
    public static void main(String[]args)
    {
        Node2 no=new Node2(5);
        no.addLeft(new Node2(6));
        no.addRight(new Node2(7));
        /*no.print();
        no.print2();*/
        no.addExact2(1, new Node2(8));
        no.print();
        System.out.println("--------------");
        no.print2();
    }
}
class Node2
{
    public Node2 first;
    public Node2 end;
    public Node2 left;
    public Node2 right;
    int data=0;
    public Node2(int n)
    {
        
        first=this;
        end=this;
        
        first.data=n;
    }
    //從頭部添加
    public void addLeft(Node2 before)
    {
        first.left=before;
        before.right=first;
        first=before;
    }
    //從尾部添加
    public void addRight(Node2 after)
    {
        end.right=after;
        after.left=end;
        end=after;
    }
    //插入正數(第三聲)的第幾個
    public void addExact(int n,Node2 no)
    {
        int count=0;
        if(n==0)
        {
            addLeft(no);
        }
        else
        {    
            Node2 f=first;
            while(true)
            {
                f=f.right;
                count++;
                if(count==n)
                {
                    //此處為四個指針的指向的變化
                    no.left=f.left;
                    f.left.right=no;
    //                first.left=no;
                    no.right=f;
                    f.left=no;
                    break;
                }
    
            }
        }
    }
    //插入倒數的第幾個
    public void addExact2(int n,Node2 no)
    {
        int count=0;
        if(n==0)
        {
            addRight(no);
        }
        else
        {
            Node2 f=end;
            while(true)
            {
                f=f.left;
                count++;
                if(count==n)
                {
                    
                    no.left=f;
                    no.right=f.right;
                    f.right.left=no;
                    f.right=no;
                    break;
                    
                }
            }
        }
    }
    //正序遍歷
    public void print()
    {
        System.out.println(first.data);
        while(first.right!=null)
        {
            System.out.println(first.right.data);
            first=first.right;
        }
//        System.out.println(end.data);
    }
    //倒序遍歷
    public void print2()
    {
        System.out.println(end.data);
        while(end.left!=null)
        {
            System.out.println(end.left.data);
            end=end.left;
        }
    }
    

}
/*值得註意的是,每一次插入一個新的對象的時候,需要註意指針指向的改變。
首先是這個新的對象兩邊的指向(左和右),其次是時左邊的對象向右的指向
和右邊對象向左的指向。
這四個指針的指向必須正確,否則可能導致正序或者倒序遍歷無法實現。
*/
/*對比單鏈表,單鏈表只能從一個方向遍歷,因為只有一個頭,而雙向鏈表,有頭和尾,可以從
 * 頭遍歷,也可以從尾遍歷,而且其中一個對象因為有兩個方向的指針,所以他可以獲得左邊的
 * 對象也可以獲得右邊的對象。
 * 但是單鏈表的話,因為只有一個方向,所以只能向左或右。添加對象的時候,雙向也可以從頭添加,也可以從尾添加。
 * 如果單鏈表要實現兩個方向添加比較難得,或者說不行,因為他只有向左或向右的一個方向的指針
 * 而雙向鏈表每個對象都有兩個方向的指針沒這樣更靈活,但是這同樣有缺點,因為這樣的話每個對象
 * 都會包含兩個指針,這同樣記憶體會消耗更多。
 * 
 * */

 

 

 

大一菜鳥初學,有誤之處請諒解。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2015老男孩Python培訓第八期視頻教程,希望您通過本教程的學習,能學會常用方法和技巧。教程從基礎知識開始講解一直到後期的案例實戰,完全零基礎學習,從初學者的角度探討分析問題,循序漸進由易到難,確保每一位初學者都能融會貫通。從零基礎到開發的大神,您只要兩個字——堅持!屌絲逆襲模式已經開啟,各位小 ...
  • 繼上一篇【Python數據分析】Python3操作Excel-以豆瓣圖書Top250為例 對豆瓣圖書Top250進行爬取以後,鑒於還有一些問題沒有解決,所以進行了進一步的交流討論,這期間得到了一隻尼瑪的幫助與啟發,十分感謝! 上次存在的問題如下: 1.寫入不能繼續的問題 2.在Python IDLE ...
  • 小Alan在最近的開發中遇到了敏感詞過濾,便去網上查閱了很多敏感詞過濾的資料,在這裡也和大家分享一下自己的理解。 在寫之前,小Alan給大家推薦一篇來自http://cmsblogs.com/?p=1031的博文,也會參考部分內容來描述博文。 敏感詞過濾應該是不用給大家過多的解釋吧?講白了就是你在項 ...
  • ...
  • 在此之前,向大家說明的是,我們整個框架用的是flask + sqlalchemy + redis。如果沒有開發過web,還是先去學習一下,這邊只是介紹如果從開發web轉換到開發移動端。如果flask還不是很熟悉,我建議先到這個網站簡單學習一下,非常非常簡單。http://dormousehole.r ...
  • gcc name.c -o name; ./name或者gcc name.c -o name && ./name;同時執行關鍵字:void sizeof(運算符,它能告訴你某樣東西在儲存器中占多少位元組。例:sizeof(int)返回4,sizeof("Turtles!")返回9,其中包含8個字元外加 ...
  • 以下內容參考java編程思想-4,jdk版本為jdk5.0,有點老-_-||| 什麼是註解 JAVA SE5引入,也稱元數據,可以直接添加到代碼中,用來完整描述程式所需的信息,而這些信息是無法用Java來表達的; 內置註解 jdk5.0中內置了三種標準註解和四種元註解; 三種標準註解,定義在java ...
  • 1、創造出一個與遠程dev分支一模一樣的分支,並切換 git checkout -b zhaojigangDev origin/dev 2、創造出一個與遠程dev分支一模一樣的分支,並追蹤該遠程dev分支,最後切換 git checkout -b zhaojigangDev --track orig ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...