Javaプログラミング:シングルチェーン表面テスト

基本的なリンクリスト構造

class NodeList {
    
    
    private Node head = new Node(0);

    public Node getHead() {
    
    
        return head;
    }

    public void add(Node node) {
    
    
        Node temp = head;
        while (temp.next != null) {
    
    
            temp = temp.next;
        }
        temp.next = node;
    }

    public void list() {
    
    
        if (head.next == null) {
    
    
            System.out.println("链表为空!");
            return;
        }
        Node temp = head.next;
        while (temp != null) {
    
    
            System.out.println(temp.toString());
            temp = temp.next;
        }
    }
}


class Node {
    
    
    public int num;
    public Node next;

    public Node(int num) {
    
    
        this.num = num;
    }

    @Override
    public String toString() {
    
    
        return "Node{" +
                "num=" + num +
                '}';
    }
}

単一リンクリストで有効なノードの数を見つけます

/**
* 求单链表中有效节点的个数
*
* @param node 头结点
* @return 有效节点个数
*/
public static int getLength(Node node) {
    
    
   if (node.next == null) {
    
    
       return 0;
   }
   Node temp = node.next;
   int len = 0;
   while (temp != null) {
    
    
       len++;
       temp = temp.next;
   }
   return len;
}

単一リンクリストの下からk番目のノードを見つけます

アイデア:

  1. ヘッドノードとインデックスを同時に受信するメソッドを記述します
  2. indexはカウントダウンインデックスノードを表します
  3. まず、リンクリストを最初から最後までトラバースして、リンクリストの全長(getLength)を取得します。
  4. サイズを取得したら
    リンクリストから最初のトラバース、トラバース(size-index)、ノードを取得します。見つかった場合はノードを返し、そうでない場合は空を返します。
/**
 * 查找单链表中倒数第index个数
 *
 * @param index index
 * @param node  头结点
 * @return 倒数第index个结点
 */
public static Node findLastIndexNode(int index, Node node) {
    
    
    if (node.next == null) {
    
    
        return null;
    }
    int size = getLength(node);
    if (index <= 0 || index > size) {
    
    
        return null;
    }
    Node temp = node.next;
    for (int i = 0; i < size - index; i++) {
    
    
        temp = temp.next;
    }
    return temp;
}

単一リンクリストの逆転

アイデア:

  1. 最初に新しいノードを定義しますreverseHead = new HearNode();
  2. 元のリンクリストを最初から最後までトラバースし、トラバースするたびにノードを取り出して、新しいリンクリストの最前線に配置します
  3. 元のリンクリストのhead.nextを配置= reverseHead.next
 /**
 *反转单链表
 *
 * @param node 头结点
 */
public static void reverseList(Node node) {
    
    
    if (node.next == null || node.next.next == null) {
    
    
        return;
    }
    Node temp = node.next;
    Node next = temp.next;
    Node result = new Node(0);
    while (temp != null) {
    
    
        next = temp.next;
        temp.next = result.next;
        result.next = temp;
        temp = next;
    }
    node.next = result.next;
}

単一リンクリストを最後から最初まで印刷する

アイデア:
要件:単一リンクリストを逆の順序で印刷する

  1. 方法1:最初に単一リンクリストを逆にしてから、トラバースします。これに伴う問題は、元の単一リンクリストの構造が破壊されることです。お勧めしません。
  2. 方法2:スタックのデータ構造を使用して各ノードをスタックにプッシュし、次にスタックの最初から最後までの機能を使用して、逆印刷の効果を実現します。
/**
* 从头到尾打印单链表
 * 方法1:反转后打印
 * 方法2:利用栈
 *
 * @param node 头结点
 */
public static void reversePrint(Node node) {
    
    
    if (node.next == null) {
    
    
        return;
    }
    Stack<Node> stact = new Stack<>();
    Node temp = node.next;
    while (temp != null) {
    
    
        stact.add(temp);
        temp = temp.next;
    }
    while (stact.size() > 0) {
    
    
        System.out.println(stact.pop());
    }
}

2つの順序付けられた単一リンクリストをマージしますが、リンクされたリストはマージ後も引き続き順序付けられています

/**
* 两个有序单链表合并为有序单链表
* @param head1 表1头节点
* @param head2 表2头节点
* @return 合并后头节点
*/
public static Node merge(Node head1, Node head2) {
    
    
   Node h1 = head1.next;
   Node h2 = head2.next;
   if (h1 == null) return h2;
   if (h2 == null) return h1;
   Node res = new Node(0);
   Node flag = res;
   while (h1 != null && h2 != null) {
    
    
       if (h1.num < h2.num) {
    
    
           flag.next = h1;
           h1 = h1.next;
       } else if (h2.num < h1.num) {
    
    
           flag.next = h2;
           h2 = h2.next;
       } else {
    
    
           flag.next = h1;
           h1 = h1.next;
           h2 = h2.next;
       }
       flag = flag.next;
   }
   if(h1==null){
    
    
       flag.next = h2;
   }
   if(h2==null){
    
    
       flag.next = h1;
   }
   return res;
}

おすすめ

転載: blog.csdn.net/KaiSarH/article/details/108701688