2.單鏈表

該部分包含以下內(nèi)容
-單鏈表的增刪改查
-計(jì)算鏈表長度
-逆序鏈表
-尋找(刪除)鏈表倒數(shù)第K個(gè)元素
-逆序打印鏈表(使用棧)


import java.util.Stack;

import javax.swing.text.AbstractDocument.BranchElement;

public class SingleLinkedListDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 先創(chuàng)建節(jié)點(diǎn)
        HeroNode hero1 = new HeroNode(1, "song", "及時(shí)雨");
        HeroNode hero2 = new HeroNode(2, "盧俊義", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吳用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林沖", "豹子頭");

        // 加入節(jié)點(diǎn)
        // 創(chuàng)建鏈表
        Singlelinkedlist singlelinkedlist = new Singlelinkedlist();
        singlelinkedlist.addByOrder(hero1);
        singlelinkedlist.addByOrder(hero4);
        singlelinkedlist.addByOrder(hero3);
        singlelinkedlist.addByOrder(hero2);
        // singlelinkedlist.addByOrder(hero3);
        singlelinkedlist.showList();
        HeroNode newheroNode = new HeroNode(2, "小路", "玉麒麟");
        singlelinkedlist.update(newheroNode);
        // singlelinkedlist.showList();

        // singlelinkedlist.deletenode(4);
        System.out.println();
        // singlelinkedlist.showList();

//      System.out.println(getLength(singlelinkedlist.getHead()));
//      System.out.println(findLastIndexNode(singlelinkedlist.getHead(), 1));
        // 逆序鏈表
        // reverseLinkList(singlelinkedlist.getHead());
        // 逆序打印
        System.out.println("********************");
        reverseprintList(singlelinkedlist.getHead());
        System.out.println();
        singlelinkedlist.showList();

    }

    // 獲取單鏈表的個(gè)數(shù)
    public static int getLength(HeroNode head) {
        if (head.next == null) {
            return 0;
        }
        int length = 0;
        HeroNode curHeroNode = head.next;
        while (curHeroNode != null) {
            length++;
            curHeroNode = curHeroNode.next;
        }
        return length;

    }

    // 查找單鏈表的倒數(shù)第k個(gè)節(jié)點(diǎn)
    // 接收head節(jié)點(diǎn),接收k 的index
    // 先把鏈表從頭到尾遍歷一下,得到鏈表的長度
    // 再遍歷size-index個(gè)節(jié)點(diǎn)
    public static HeroNode findLastIndexNode(HeroNode head, int index) {
        if (head.next == null) {
            return null;
        }
        // 獲得鏈表長度
        int size = getLength(head);
        // 檢驗(yàn)index是否合法

        if (index <= 0 || index > size) {
            System.out.println("index不合法");
            return null;
        }

        HeroNode curHeroNode = head.next;
        for (int i = 1; i <= size - index; i++) {
            // 走幾步到倒數(shù)第K個(gè)節(jié)點(diǎn)
            curHeroNode = curHeroNode.next;
        }
        return curHeroNode;

    }

    // 單鏈表反轉(zhuǎn)
    // 第一種方法:建立一個(gè)新鏈表,然后使用頭插法建立鏈表
    public static void reverseLinkList(HeroNode head) {
        if (head.next == null) {
            return;
        }
        HeroNode reverseHead = new HeroNode(0, "", "");
        HeroNode curHeroNode = head.next;
        HeroNode nextHeroNode = null;
        while (curHeroNode != null) {
            // HeroNode tmpHeroNode=curHeroNode;
            nextHeroNode = curHeroNode.next;
            curHeroNode.next = reverseHead.next;
            reverseHead.next = curHeroNode;
            curHeroNode = nextHeroNode;
        }
        head.next = reverseHead.next;
    }

    public static void showreverseList(HeroNode head) {
        // 判斷鏈表是否為空
        if (head.next == null) {
            return;
        }

        HeroNode tempHeroNode = head.next;
        while (true) {
            // 判斷是否已經(jīng)到達(dá)最后一個(gè)節(jié)點(diǎn)
            if (tempHeroNode == null) {
                break;
            }
            // 打印
            System.out.println(tempHeroNode);
            //
            tempHeroNode = tempHeroNode.next;

        }

    }
    // 逆序打印

    public static void reverseprintList(HeroNode head) {
        if (head.next == null) {
            return;
        }

        // 創(chuàng)建一個(gè)棧艇纺,不需要自己寫
        Stack<HeroNode> stack = new Stack<HeroNode>();
        HeroNode curHeroNode = head.next;
        while (curHeroNode != null) {
            stack.push(curHeroNode);
            curHeroNode = curHeroNode.next;
        }

        while (stack.size() > 0) {
            System.out.println(stack.pop());
        }

    }

}

// 定義linklist
class Singlelinkedlist {
    // 初始化頭節(jié)點(diǎn)
    private HeroNode head = new HeroNode(0, "", "");

    // 添加節(jié)點(diǎn)到單向鏈表
    // 1.找到當(dāng)前鏈表的最后節(jié)點(diǎn)
    // 2.將最后的next域指向最后節(jié)點(diǎn)
    public void addNode(HeroNode heronode) {
        HeroNode tempHeroNode = head;
        while (true) {
            // 獲取最后的節(jié)點(diǎn)
            if (tempHeroNode.next == null) {
                break;
            }
            tempHeroNode = tempHeroNode.next;

        }
        // 將最后節(jié)點(diǎn)的next
        tempHeroNode.next = heronode;
    }

    // 按順序添加節(jié)點(diǎn)
    public void addByOrder(HeroNode heronode) {
        HeroNode tmpHeroNode = head;
        boolean flag = false;
        while (true) {
            // 如果是最后一個(gè)節(jié)點(diǎn)盟劫,證明需要插入到最后急迂,直接退出
            if (tmpHeroNode.next == null) {
                break;
            }
            // 找到插入位置
            if (tmpHeroNode.next.no > heronode.no) {
                break;
            } else if (tmpHeroNode.next.no == heronode.no) {
                flag = true;
                break;
            }
            tmpHeroNode = tmpHeroNode.next;
        }
        // 判斷是否能夠插入
        if (flag) {
            System.out.println("待插入節(jié)點(diǎn)已存在");

        } else {
            heronode.next = tmpHeroNode.next;
            tmpHeroNode.next = heronode;
        }

    }

    // 修改節(jié)點(diǎn)信息,編號(hào)不能變
    // 根據(jù)節(jié)點(diǎn)編號(hào)修改
    public void update(HeroNode newheroNode) {
        // 判斷鏈表是否為空
        if (head.next == null) {
            System.out.println("鏈表為空");
            return;
        }
        HeroNode tmpHeroNode = head.next;
        boolean flag = false;
        while (true) {
            if (tmpHeroNode == null) {
                break;
            }
            if (tmpHeroNode.no == newheroNode.no) {
                flag = true;
                break;
            }
            tmpHeroNode = tmpHeroNode.next;
        }

        if (flag) {
            tmpHeroNode.name = newheroNode.name;
            tmpHeroNode.nickname = newheroNode.nickname;

        } else {
            System.out.printf("編號(hào)為%d的節(jié)點(diǎn)不存在\n", newheroNode.no);
        }

    }

    public void showList() {
        // 判斷鏈表是否為空
        if (head.next == null) {
            return;
        }

        HeroNode tempHeroNode = head.next;
        while (true) {
            // 判斷是否已經(jīng)到達(dá)最后一個(gè)節(jié)點(diǎn)
            if (tempHeroNode == null) {
                break;
            }
            // 打印
            System.out.println(tempHeroNode);
            //
            tempHeroNode = tempHeroNode.next;

        }

    }

    // 單鏈表的刪除
    public void deletenode(int no) {
        if (head.next == null) {
            System.out.println("鏈表為空");
            return;
        }
        // 找到需要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)。
        HeroNode tmpHeroNode = head;
        boolean flag = false;
        while (true) {
            if (tmpHeroNode.next == null) {
                break;
            }

            if (tmpHeroNode.next.no == no) {
                flag = true;
                break;
            }
            tmpHeroNode = tmpHeroNode.next;

        }

        if (flag) {
            tmpHeroNode.next = tmpHeroNode.next.next;

        } else {
            System.out.printf("編號(hào)為%d的節(jié)點(diǎn)不存在,無法刪除\n", no);
        }

    }

    // 獲取單鏈表的個(gè)數(shù),不包括頭結(jié)點(diǎn)
    /**
     * 
     * @return 返回有效節(jié)點(diǎn)個(gè)數(shù)
     */

    // 返回頭結(jié)點(diǎn)
    public HeroNode getHead() {
        return head;
    }

}

//定義單個(gè)節(jié)點(diǎn)
class HeroNode {
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;

    public HeroNode(int no, String name, String nickname) {
        super();
        this.no = no;
        this.name = name;
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闹炉,一起剝皮案震驚了整個(gè)濱河市壹若,隨后出現(xiàn)的幾起案子养篓,更是在濱河造成了極大的恐慌碧注,老刑警劉巖萍丐,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骨田,死亡現(xiàn)場離奇詭異悠汽,居然都是意外死亡兆旬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門脚祟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谬以,“玉大人,你說我怎么就攤上這事为黎。” “怎么了行您?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長骤星。 經(jīng)常有香客問我,道長色冀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任望拖,我火速辦了婚禮丢郊,結(jié)果婚禮上盔沫,老公的妹妹穿的比我還像新娘。我一直安慰自己枫匾,他們只是感情好架诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著干茉,像睡著了一般谴忧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上角虫,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天沾谓,我揣著相機(jī)與錄音,去河邊找鬼戳鹅。 笑死均驶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枫虏。 我是一名探鬼主播妇穴,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼爬虱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了腾它?” 一聲冷哼從身側(cè)響起跑筝,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎携狭,沒想到半個(gè)月后继蜡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逛腿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仅颇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单默。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖忘瓦,靈堂內(nèi)的尸體忽然破棺而出搁廓,到底是詐尸還是另有隱情,我是刑警寧澤耕皮,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布境蜕,位于F島的核電站,受9級(jí)特大地震影響凌停,放射性物質(zhì)發(fā)生泄漏粱年。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一罚拟、第九天 我趴在偏房一處隱蔽的房頂上張望台诗。 院中可真熱鬧,春花似錦赐俗、人聲如沸拉队。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粱快。三九已至,卻和暖如春叔扼,著一層夾襖步出監(jiān)牢的瞬間事哭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工币励, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷蠕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓食呻,卻偏偏與公主長得像流炕,于是被迫代替她去往敵國和親澎现。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351