面接の質問———————単一のリンクリスト

単一リンクリストを学習した後、アイロンが熱いうちにいくつかのインタビューの質問をしました。(リンクをクリックすると、以前の単一リンクリストの調査
が表示されます次の1〜5の質問の難易度が順番に上がり、各質問のアイデアと実装プロセスが詳細に表示されます。

  1. 単一リンクリストでノードの数を見つけます
  2. 単一リンクリストの下からk番目のノードを見つけます[Sinaインタビューの質問]
  3. 単一リンクリストの逆転[10のインタビューの質問]
  4. 単一リンクリストを最後から最初まで印刷します[Baidu、リクエスト方法1:逆トラバーサル、方法2:スタックスタック]
  5. 2つの順序付けられた単一リンクリストをマージしますが、リンクリストはマージ後も引き続き順序付けられています

各質問を完了する前に、あなたはそれを完了するためにあなた自身の理解を使うことができます。以下では、私の思考分析とコードの実装プロセスについてのみ話します。

01単一リンクリスト内のノード数を検索します

思考分析:

1.空かどうかを判断します
。2。ループトラバーサル-補助ノードの次のノードがnullに等しくない場合、length ++
固有のコード:

   /**
    * @param head 头节点
    * @return 返回的是单链表有效节点的个数
    */
   public static int findSingleLinkLength(HeroNode head) {
    
    
       //辅助节点
       HeroNode cur = head.next;
       if (cur == null) {
    
    
           return 0;
       }
       //定义一个变量接收节点的个数
       int length = 0;
       while (cur != null) {
    
    
           //后移 接着遍历寻找
           cur = cur.next;
           length++;
       }
       return length;
   }

コードテスト:

public class SingleLinkedListDemo {
    
    
   public static void main(String[] args) {
    
    
       SingleLinkedList singleLinkedList = new SingleLinkedList();
       HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
       HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
       HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
       HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
       HeroNode hero5 = new HeroNode(5, "李逵", "黑旋风");
       //添加英雄
       singleLinkedList.add(hero1);
       singleLinkedList.add(hero3);
       singleLinkedList.add(hero5);
       singleLinkedList.add(hero2);
   	
   	   //测试单链表有效节点的个数
       int length = findSingleLinkLength(singleLinkedList.getHead());
       System.out.println("length=" + length);
   }
}

試験結果:

長さ= 4

02単一リンクリストの下からk番目のノードを見つけます[Sinaインタビューの質問]

アイデアの分析:
1。ループスルー(ノードの総数-ターゲットノードの数)
例:合計4つのノードが下から3番目を検索する必要があります。これを行う方法は、ループを介してこのノードを検索することです。 (4-3)、ここで4が渡されます。メソッドfindSingleLinkLengthを呼び出して取得します。3はユーザーから渡された値です。
特定のコード:

    //查找单链表中倒数第K个节点【新浪面试】
    public static HeroNode findHeroNode(HeroNode head, int no) {
    
    
        //定义辅助节点指向第一个节点
        HeroNode cur = head.next;
        //找出总的节点数
        int size = findSingleLinkLength(head);
        //对传入的no进行校验 
        //不存在倒数第0个节点的说法 也不存在要查找的节点数大于总节点数
        if (no <= 0 || no > size) {
    
    
            return null;
        }
        //循环遍历 假如 3个节点  查找倒数第二个节点 3-2=1
        for (int i = 0; i < size - no; i++) {
    
    
        	//后移
            cur = cur.next;
        }
        return cur;
    }

コードテスト:

 public class SingleLinkedListDemo {
    
    
    public static void main(String[] args) {
    
    
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode hero5 = new HeroNode(5, "李逵", "黑旋风");
        //添加英雄
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero5);
        singleLinkedList.add(hero2);
        //测试单链表中倒数第K个节点
        int no = 3;
        HeroNode heroNode = findHeroNode(singleLinkedList.getHead(), no);
        System.out.printf("倒数第%d节点", no);
        System.out.println(heroNode);
    }
}

試験結果:

最後から3番目のノードHeroNode {no = 3、name = 'Wu Yong'、nickname = 'Zhiduoxing'}

03単一リンクリストの逆転[10件の面接質問]

アイデアの分析:
1。最初にノードを定義しますHeroNode reverse = new HeroNode(0、 ""、 "");
2.元のリンクリストを最初から最後までトラバースし、ノードがトラバースされるたびにそれを取り出して配置します新しいリンクリスト内reverseHead3の最前線
。元のリンクリストのhead.next = reverseHead.next

 //单链表的反转
    public static void reverseSingleLink(HeroNode head) {
    
    
        //没有节点或者只存在一个节点
        if (head.next == null || head.next.next == null) {
    
    
            return;
        }
        //创建一个新的单链表
        HeroNode reverseHead = new HeroNode(0,"","");
        //定义一个辅助变量,帮助我们遍历原来的链表
        HeroNode cur = head.next;
        HeroNode next = null;//指向当前节点的下一个节点

        while (cur != null) {
    
    
            //保留当前节点的下一个节点
            next = cur.next;
            //cur的下一个节点指向新链表的前端
            cur.next = reverseHead.next;
            //将cur连接到新的链表上
            reverseHead.next = cur;
            cur = next;//节点后移
        }
        //将 head.next 指向 reverseHead.next 实现单链表的反转
        head.next = reverseHead.next;
    }

コードテスト:

public class SingleLinkedListDemo {
    
    
    public static void main(String[] args) {
    
    
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode hero5 = new HeroNode(5, "李逵", "黑旋风");
        //添加英雄
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero5);
        singleLinkedList.add(hero2);
        System.out.println("反转前的链表");
        singleLinkedList.list();
 		System.out.println("测试反转后的链表");
        reverseSingleLink(singleLinkedList.getHead());
        singleLinkedList.list();
    }
}

試験結果:

逆転前のリンクリスト
HeroNode {no = 1、name = 'Songjiang'、nickname = 'Timely Rain'}
HeroNode {no = 3、name = 'Wu Yong'、nickname = 'Zhiduoxing'}
HeroNode {no = 5、 name = '
李逵'、nickname = 'Black Whirlwind'} HeroNode(no = 2、name = 'Lu Junyi'、nickname = 'Jade Qilin '}
逆リンクリスト
HeroNode(no = 2、name = 'Lu Junyi'をテストする、nickname = 'Jade Kirin'}
HeroNode {no = 5、name = 'Li Kui'、nickname = '
黑旋风'} HeroNode {no = 3、name = 'Wu Yong'、nickname = '智多星'}
HeroNode {no = 1、name = 'Song Jiang'、nickname = 'Timely rain'}

04単一リンクリストを最後から最初まで印刷する[Baidu、リクエスト方法1:リバーストラバーサル、方法2:スタックスタック]

思考分析:
1。スタックの最初から最後までの機能を使用して、逆印刷を実現します。

スタックの基本的な使用法:スタック、ポップ

	    Stack<String> stack = new Stack<>();
        //入栈
        stack.push("张三");
        stack.push("王五");
        stack.push("赵六");
        //出栈
        while (stack.size() > 0){
    
    
            System.out.println(stack.pop());
        }

結果の印刷:

趙劉王
呉張
さん

スタックの逆印刷を実現するには:

 //实现链表的逆序打印
    public static void reversePrint(HeroNode head){
    
    
        //判断链表是否为空
        if (head.next == null){
    
    
            return;
        }
        //创建栈,将各个节点压入栈中
        Stack<HeroNode> stack = new Stack<>();
        //辅助变量指向节点
        HeroNode cur = head.next;
        //入栈
        while (cur != null) {
    
    
            stack.push(cur);
            //节点后移 下一个节点压入栈
            cur = cur.next;
        }
        //出栈
        while (stack.size() > 0){
    
    
            System.out.println(stack.pop());
        }
    }

コードテスト:

public class SingleLinkedListDemo {
    
    
    public static void main(String[] args) {
    
    
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode hero5 = new HeroNode(5, "李逵", "黑旋风");
        //添加英雄
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero5);
        singleLinkedList.add(hero2);

        //循环遍历
        System.out.println("单链表的信息");
        singleLinkedList.list();

        System.out.println("测试逆序打印链表");
        reversePrint(singleLinkedList.getHead());
    }
}

試験結果:


単一リンクリストの情報HeroNode {no = 1、name = 'Song Jiang'、nickname = 'Timely Rain'}
HeroNode {no = 3、name = 'Wu Yong'、nickname = '智多星'}
HeroNode {no = 5、name = 'Li Kui'、nickname = 'Black Whirlwind'}
HeroNode(no = 2、name = 'Lu Junyi'、nickname = '玉麒麟'}
リンクリストの逆印刷をテストする
HeroNode {no = 2、name = 'Lu Junyi'、nickname = '玉キリン'}
HeroNode {no = 5、name = 'Li Kui'、nickname = 'Black Whirlwind'}
HeroNode {no = 3、name = 'Wu Yong'、nickname = 'Zhiduoxing '}
HeroNode {no = 1、name =' Song Jiang '、nickname =' Timely rain '}

上記は、単一リンクリストに関するいくつかのインタビューの質問です。複数の方法を試す方法は、この方法だけではありません。

おすすめ

転載: blog.csdn.net/lirui1212/article/details/111188531