基本的なリンクリスト構造
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番目のノードを見つけます
アイデア:
- ヘッドノードとインデックスを同時に受信するメソッドを記述します
- indexはカウントダウンインデックスノードを表します
- まず、リンクリストを最初から最後までトラバースして、リンクリストの全長(getLength)を取得します。
- サイズを取得したら
、リンクリストから最初のトラバース、トラバース(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;
}
単一リンクリストの逆転
アイデア:
- 最初に新しいノードを定義しますreverseHead = new HearNode();
- 元のリンクリストを最初から最後までトラバースし、トラバースするたびにノードを取り出して、新しいリンクリストの最前線に配置します
- 元のリンクリストの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:最初に単一リンクリストを逆にしてから、トラバースします。これに伴う問題は、元の単一リンクリストの構造が破壊されることです。お勧めしません。
- 方法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;
}