單鏈表

單鏈表鏈表是有序的列表


截圖.png
  1. 鏈表是以節(jié)點(diǎn)的方式來存儲,是鏈?zhǔn)酱鎯Φ?/li>
  2. 每個節(jié)點(diǎn)包含data域,next域:指向下一個節(jié)點(diǎn)
  3. 如圖:鏈表的各個節(jié)點(diǎn)不一定連續(xù)存儲
  4. 鏈表分帶頭節(jié)點(diǎn)的鏈表和沒有帶頭節(jié)點(diǎn)的鏈表,根絕實(shí)際的需求來確定
    創(chuàng)建,新增,修改,刪除鏈表代碼實(shí)現(xiàn):
package com.swh.data;

import com.alibaba.fastjson.JSON;

public class LinkedList {

    public static void main(String[] args) {
        Node node1 = new Node(23, "向喀什23");
        Node node2 = new Node(40, "向喀什40");
        Node node3 = new Node(20, "向喀什20");
        Node node4 = new Node(39, "向喀什39");
        
        SingleLinked singleLinked = new SingleLinked();
        singleLinked.addNode(node1);
        singleLinked.addNode(node2);
        singleLinked.addNode(node3);
        singleLinked.addNode(node4);
        singleLinked.addNode(node4);
        
        singleLinked.updateNode(40, "my name is 40");
        singleLinked.delete(23);
        singleLinked.showNode();
        singleLinked.delete(40);
        singleLinked.delete(39);
        singleLinked.delete(20);
        singleLinked.delete(20);

        singleLinked.showNode();

    }

}

class SingleLinked {

    private Node head = new Node(0, "");

    // 添加鏈表
    public void addNode(Node node) {
        // 獲取最后一個節(jié)點(diǎn)
        Node temp = head;

        while (true) {
            if (temp.getNo() == node.getNo()) {
                System.out.println("添加的節(jié)點(diǎn)已經(jīng)存在了??! no->" + node.getNo() + "  name->" + node.getName());
                return;
            }
            if (temp.getNext() == null) {

                temp.setNext(node);
                return;
            }

            if (temp.getNext().getNo() > node.getNo()) {
                node.setNext(temp.getNext());
                temp.setNext(node);
                return;
            }


            temp = temp.getNext();
        }
    }

    // 修改鏈表
    public void updateNode(int no, String name) {

        Node temp = head.getNext();

        while (true) {
            if (temp == null) {
                System.out.println("鏈表中無數(shù)據(jù)~");
                return;
            }
            if (temp.getNo() == no) {
                temp.setName(name);
                return;
            }

            if (temp.getNo() != no && temp.getNext() == null) {
                System.out.printf("未查詢到編號為%d的數(shù)據(jù)信息\n", no);
                return;
            }
            temp = temp.getNext();

        }

    }

    //刪除列表
    public void delete(int no) {

        Node temp = head;

        while (true) {
            if (temp.getNext() == null) {
                System.out.printf("未查詢到編號為%d的數(shù)據(jù)信息", no);
                return;
            }
            if (temp.getNext().getNo() == no) {
                temp.setNext(temp.getNext().getNext());
                return;
            }
            temp = temp.getNext();

        }

    }


    public void showNode() {

        Node temp = head.getNext();

        while (true) {
            if (temp == null) {
                System.out.println("鏈表中無數(shù)據(jù)~");
                return;
            }
            System.out.println(temp.toString());

            if (temp.getNext() == null)
                return;

            temp = temp.getNext();


        }


    }


}


class Node {

    private int no;

    private String name;

    private Node next;


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

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

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

單鏈表的常見面試題有如下:
1)求單鏈表中有效節(jié)點(diǎn)的個數(shù)
思路:直接遍歷鏈表中的數(shù)據(jù)

 //求鏈表中的個數(shù)  直接遍歷鏈表
    public int getSize() {
        Node temp = head.getNext();
        int size = 0;
        while (true) {
            if (temp == null) {
                System.out.println("鏈表中無數(shù)據(jù)~");
                return size;
            }
            size++;
            temp = temp.getNext();
        }
    }

2)查找單鏈表中的倒數(shù)第k個節(jié)點(diǎn)【新浪】

// 查找單鏈表中的倒數(shù)第K個節(jié)點(diǎn)
    // 思路:獲取總條數(shù) 然后求出正數(shù)多少個  然后進(jìn)行遍歷求出、

    public Node getFromBehindKNode(int k) {
        // 獲取總條數(shù)
        int size = getSize();
        k = size - k + 1;
        if (k <= 0) {
            System.out.println("請?jiān)阪湵淼姆秶鷥?nèi)查詢");
            return null;
        }
        Node temp = head.getNext();
        int count = 0;
        while (true) {
            if (temp == null) {
                System.out.println("鏈表中無數(shù)據(jù)~");
                return null;
            }
            count++;

            if (count == k) return temp;
            temp = temp.getNext();
        }
    }

3)單鏈表的反轉(zhuǎn)【騰訊】

//單鏈表的反轉(zhuǎn)
    //思路 : 遍歷鏈表 把遍歷到的節(jié)點(diǎn)遷移到第一個
    public void reverse(){

        if(head.getNext()==null){  // 如果發(fā)現(xiàn)鏈表為空就直接返回
            System.out.println("鏈表為空");
            return;
        }

        Node temp = head.getNext();

        while (true){
            Node next= null;
            // 當(dāng)?shù)谝粋€節(jié)點(diǎn)是最后一個節(jié)點(diǎn)時就不需要進(jìn)行移動了
            if((next=temp.getNext())==null)return;
            // 1.把當(dāng)前節(jié)點(diǎn)的指針指向下下一個節(jié)點(diǎn)
            temp.setNext(next.getNext());
            // 2.將獲取到的節(jié)點(diǎn)設(shè)置成第一個節(jié)點(diǎn)
            next.setNext(head.getNext());
            head.setNext(next);
        }

    }

4)從尾到頭打印單鏈表【百度,要求方式1 :反向遍歷 方式2 stack?!?/p>

public void reversePrint() {
        Node temp = head.getNext();
        if (temp == null) {
            System.out.println("鏈表為空");
            return;
        }
        Stack<Node> stack = new Stack();

        while (true) {
            if (temp == null) break;

            stack.push(temp);
            temp = temp.getNext();
        }


        while (stack.size()>0){
            System.out.println("鏈表中的信息->"+JSON.toJSONString(stack.pop().getNext().getNo()));
        }

    }

5)合并兩個有序的單鏈表,合并之后的鏈表依然有序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容