【數據結構和算法】001 單鏈表 LinkedList

 

 小朋友,你是否有不少問號?爲何?別人都在看漫畫,而我在學畫畫,對着鋼琴說話...面試

 

 

 


 

1、單鏈表(LinkedList)介紹和內存佈局ide

鏈表是有序的列表,它在內存中的實際存儲結構以下:佈局

     

 

 看上去雖然無序,但ta是靠每一個鏈表節點元素的   地址  和  next域  來分清首尾相連的順序,以下圖所示,由頭指針指向第一個元素,進而第二個、三個...測試

  

 

鏈表的邏輯結構:this

 

 

 

 

2、單鏈表建立、遍歷實現以及單鏈表節點增、刪、改、查操做spa

 

一、建立、新增、遍歷顯示3d

 

模型以下:1)head節點 2)中間節點 3)尾結點指針

                 每一個節點的next域指向下一個節點的對象地址,尾結點爲空code

 

 

新建所需實體類:對象

package ...;

/**
 * @Author: ldk
 * @Date: 2020/3/29 21:18
 * @Describe:
 */
public class HeroNode {
    public int no;
    public String name;
    public String nickName;
    public HeroNode next;//指向下一個節點

    //構造節點對象
    public HeroNode(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    //重寫toString()

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
//GetSet方法自行腦補....
}

 

建立 SingleLinkedList 類,編寫 添加 和 遍歷 的方法 並 建立main方法測試:

package ...;

/**
 * @Author: ldk
 * @Date: 2020/3/29 21:25
 * @Describe:
 */
public class LinkedListTest {
    public static void main(String[] args) {
        HeroNode h1 = new HeroNode(1, "張三", "小三");
        HeroNode h2 = new HeroNode(2, "李四", "小四");
        HeroNode h3 = new HeroNode(3, "王五", "小五");
        HeroNode h4 = new HeroNode(4, "趙六", "小六");
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        singleLinkedList.add(h1);
        singleLinkedList.add(h2);
        singleLinkedList.add(h3);
        singleLinkedList.add(h4);
        singleLinkedList.detail();
    }

    static class SingleLinkedList {
        //建立頭結點
        private HeroNode head = new HeroNode(0, "", "");

        //節點添加方法
        public void add(HeroNode heroNode) {

            //拿到頭結點
            HeroNode temp = head;
            //找到最後一個節點,把next域指向要添加的節點
            while (true) {
                if (temp.next == null) {
                    break;
                }
                temp = temp.next;
            }
            temp.next = heroNode;
        }

        //顯示鏈表【遍歷】
        public void detail() {
            if (head.next == null) {
                System.out.println("鏈表爲空!");
                return;
            }
            //獲取一個臨時指針
            HeroNode temp = head.next;
            while (true) {
                if (temp.next == null){
                    System.out.println(temp.toString());
                    System.out.println("就這麼多了~~");
                    break;
                }
                System.out.println(temp.toString());
                temp = temp.next;
            }
        }
    }
}

 

運行結果:

 

二、按順序插入節點

上面的測試是從1,2,3,4依次插入,那麼,鏈表自己是有序的,咱們能不能按照no字段亂序插入實現自動遞增排序,且從重複元素再也不重複插入,

 意思就是,插入順序改爲1432,但鏈表內部結構依然是1234

 代碼只需稍微對add()方法修改一下:

        //按照字段no 升序插入
        public void add2(HeroNode heroNode) {
            //獲取指針
            HeroNode temp = head;
            while (true) {
                if (temp.next == null) {
                    break;
                } else if (temp.next.no == heroNode.no) {
                    System.out.println("該節點已經存在~");
                    return;
                } else if (temp.next.no > heroNode.no) {
                    break;
                }
                temp = temp.next;
            }
            heroNode.next = temp.next;
            temp.next = heroNode;
        }

 

凌亂且重複的插入順序:

 

有序的打印結果:

依然是1234的順序,並且重複的元素再也不插入 ~

 

 

 

其他增刪改查有時間能夠作本身思考一下,這裏再也不贅述。

 

3、單鏈表新浪、騰訊、百度面試題

 

 

 解答暫時值分析思路,代碼後期慢慢填補:

1)思路:從頭結點的下一個開始,一直遍歷,每遍歷一個即+1,直到.next爲空,此所得即爲鏈表長度

2)思路:依然是遍歷,從第一個一直遍歷到第length-k的下一個即爲k

代碼(後補):

3)思路:有點難度,但也是很清晰的。

分爲母鏈和子鏈,母鏈雙指針,子鏈單指針

母鏈拆一個節點拼接到子鏈頭部後第一個,以此類推,獲得的全新子鏈即爲反轉鏈:

代碼(後補):

 

 

4)思路:同4,反轉後,打印便可。

5)思路:以其中一個鏈表爲母鏈,另外一個爲子鏈,遍歷子鏈,挨個插入母聯便可。

 

2020-03-29  21:02:13

相關文章
相關標籤/搜索