溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java如何實(shí)現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn)、逆序等操作

發(fā)布時(shí)間:2021-10-15 13:36:57 來(lái)源:億速云 閱讀:97 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Java如何實(shí)現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn)、逆序等操作的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

節(jié)點(diǎn)類(lèi)

可以根據(jù)需要,對(duì)節(jié)點(diǎn)屬性進(jìn)行修改。注意重寫(xiě)toString()方法,以便后續(xù)的輸出操作。

//節(jié)點(diǎn)類(lèi)
class Node {
    public int id;
    public String name;
    public Node next;

    public Node(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

鏈表類(lèi)(主要)

所實(shí)現(xiàn)的增刪改查,反轉(zhuǎn),逆序等功能基本能適用。實(shí)現(xiàn)思路在代碼中注釋。

//鏈表類(lèi)(管理節(jié)點(diǎn))
class LinkedList {
    //頭節(jié)點(diǎn)
    Node head = new Node(0,null);

    //鏈表有效數(shù)據(jù)個(gè)數(shù)(鏈表長(zhǎng)度)(頭節(jié)點(diǎn)不計(jì))
    public int size(){
        Node temp = head;
        int size = 0;
        while (true){
            if (temp.next == null){
                break;
            }
            size++;
            temp = temp.next;
        }
        return size;
    }

    //展示鏈表
    public void list(){
        if (head.next == null){
            System.out.println("鏈表為空!");
            return;
        }
        Node temp = head.next;
        while (true){
            if (temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }
    }

    //增(根據(jù)id從小到大)
    public void add(Node newNode){
        Node temp = head;
        while (true){ //用來(lái)找到鏈表尾
            if (temp.next == null) {
                break;
            }
            if (temp.id == newNode.id){
                System.out.println("要添加的節(jié)點(diǎn)的id已經(jīng)存在,添加失??!");
                return;
            }
            if (temp.next.id > newNode.id){
                break;
            }
            temp = temp.next;
        }
        Node node = newNode;
        newNode.next = temp.next;
        temp.next = node;
    }

    //刪(根據(jù)id匹配刪除)
    public void remove(int id){
        if (head.next == null){
            System.out.println("鏈表為空!");
            return;
        }
        Node temp = head;
        boolean flag = false; //用來(lái)標(biāo)記是否找到對(duì)應(yīng)id的節(jié)點(diǎn)
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.next.id == id){ //找到要?jiǎng)h除節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)
                flag =true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.next = temp.next.next;
        }else {
            System.out.println("沒(méi)有找到要?jiǎng)h除的節(jié)點(diǎn),刪除失敗!");
        }
    }

    //改(根據(jù)id匹配要修改的節(jié)點(diǎn))
    public void update(int id,String name){
        if (head.next == null){
            System.out.println("鏈表為空!");
            return;
        }
        Node temp = head;
        boolean flag = false; //用來(lái)標(biāo)記是否找到對(duì)應(yīng)id的節(jié)點(diǎn)
        while (true){
            if (temp.next == null){
                break;
            }
            if (temp.id == id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            temp.name = name;
        }else {
            System.out.println("沒(méi)有找到要修改的節(jié)點(diǎn),修改失??!");
        }
    }

    //查(根據(jù)id匹配)
    public Node show(int id){
        if (head.next == null){
            System.out.println("鏈表為空!");
            return null;
        }
        Node temp = head.next;
        boolean flag = false;
        while (true){
            if (temp == null){
                break;
            }
            if (temp.id == id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            return temp;
        }else {
            System.out.println("沒(méi)有找到要查找的節(jié)點(diǎn),查找失??!");
            return null;
        }
    }

    //查找倒數(shù)第n個(gè)節(jié)點(diǎn)
    public Node lastShow(int n){
        Node temp = head.next;
        int size = this.size();
        if (size < n || n <= 0){
            System.out.println("查找的節(jié)點(diǎn)不存在!");
            return  null;
        }
        for (int i = 0; i < size - n; i++) {
            temp = temp.next;
        }
        return temp;
    }

    //鏈表反轉(zhuǎn)
    public void reverse(){
        if (head.next == null || head.next.next == null){
            return;
        }
        Node reverseHead = new Node(0,null);
        Node cur = head.next; //記錄當(dāng)前遍歷到的節(jié)點(diǎn)
        Node next = null; //記錄當(dāng)前遍歷到的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
        while (true){
            if (cur == null){ //確保遍歷到最后一個(gè)
                break;
            }
            next = cur.next; //保存下一個(gè)節(jié)點(diǎn),避免斷鏈
            //使得反轉(zhuǎn)頭節(jié)點(diǎn)指向遍歷到的當(dāng)前節(jié)點(diǎn),而讓遍歷到的當(dāng)前節(jié)點(diǎn)指向反轉(zhuǎn)頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
            // 確保遍歷到的當(dāng)前節(jié)點(diǎn)始終位于反轉(zhuǎn)頭節(jié)點(diǎn)的下一個(gè)
            cur.next = reverseHead.next;
            reverseHead.next = cur;
            //遍歷
            cur = next;
        }
        head.next = reverseHead.next; //最后讓原頭節(jié)點(diǎn)指向反轉(zhuǎn)頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),即可實(shí)現(xiàn)原鏈表的反轉(zhuǎn)
    }

    //逆序打印
    //方法一:先反轉(zhuǎn)
    //方法二:使用棧結(jié)構(gòu)
    public void reversePrint(){
        if (head.next == null){
            System.out.println("鏈表為空!");
            return;
        }
        Stack<Node> nodes = new Stack<>();
        Node temp = head.next;
        while (true){
            if (temp == null){
                break;
            }
            nodes.push(temp);
            temp = temp.next;
        }
        while (nodes.size() > 0){
            System.out.println(nodes.pop());
        }
    }
}

測(cè)試類(lèi)

import java.util.Stack;

/**
 * @Author: Yeman
 * @Date: 2021-10-14-12:55
 * @Description:
 */
//測(cè)試類(lèi)
public class SingleLinkedListTest {
    public static void main(String[] args) {

        LinkedList linkedList = new LinkedList();

        Node node1 = new Node(1, "阿蘭");
        Node node2 = new Node(2, "洛國(guó)富");
        Node node3 = new Node(3, "艾克森");

		//可以不按照id順序添加
        linkedList.add(node1);
        linkedList.add(node3);
        linkedList.add(node2);

        linkedList.list();

        System.out.println(linkedList.size()); //鏈表長(zhǎng)度

//        System.out.println(linkedList.lastShow(2)); //倒數(shù)查找

//        linkedList.update(2,"張玉寧"); //改
//
//        linkedList.remove(3); //刪
//
//        System.out.println(linkedList.show(2)); //查

//        linkedList.reverse(); //鏈表反轉(zhuǎn)

        linkedList.reversePrint(); //逆序打印
        
    }
}

感謝各位的閱讀!關(guān)于“Java如何實(shí)現(xiàn)單鏈表SingleLinkedList增刪改查及反轉(zhuǎn)、逆序等操作”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI