1、链表的简单实现:
Node类(链表节点):
class Node {
int data; // 数据
Node next; // 下一节点
Node (int data) {
this.data = data;
this.next = null;
}
}
LinkedList类(链表):
class LinkedList {
Node head;
// 添加节点到链表末尾
void append(int data) {
Node newNode = new Node(data);
if (head == null) { // 判断是否有链表头
head = newNode;
return;
}
Node last = head;
while (last.next != null) { // 判断是否到了链表尾
last = last.next;
}
last.next = newNode;
}
// 遍历并打印链表
void printList() {
Node temp = head;
while (temp != null) {
System.out.print(temp.data + " ");
temp = temp.next;
}
System.out.println();
}
// 在链表开头插入节点
void insertAtStart(int data) {
Node newNode = new Node(data);
newNode.next = head;
head = newNode;
}
// 删除链表中的节点
void deleteNode(int key) {
if (head == null) { // 判断是否为空链表
return;
}
if (head.data == key) { // 判断表头是否为指定节点
head = head.next;
return;
}
Node temp = head;
while (temp.next != null) {
if (temp.next.data == key) {
temp.next = temp.next.next;
return;
}
temp = temp.next;
}
}
}
测试结果:
public class Main {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
linkedList.append(4);
linkedList.printList(); // 输出: 1 2 3 4
linkedList.insertAtStart(0);
linkedList.printList(); // 输出: 0 1 2 3 4
linkedList.deleteNode(2);
linkedList.printList(); // 输出: 0 1 3 4
}
}
2、在Java面试中,关于链表的题目通常涉及:链表的基本操作、结构理解、性能分析以及算法实现等。
-
链表反转:
给定一个单向链表的头节点,要求将其反转,并返回新的头节点:
解题思路:使用三个指针pre
、cur
、next
来遍历链表,将cur
的next
指向pre
,然后移动指针,直到遍历完整个链表。
-
链表中环的检测:
给定一个单向链表的头节点,判断链表中是否存在环:
解题思路:使用快慢指针的方法,快指针每次移动两个节点,慢指针每次移动一个节点,若存在环,则快指针最终会追上慢指针;若不存在环,则快指针会先到达链表尾部。
-
链表的中间节点:
给定一个单向链表的头节点,找到链表的中间节点:
解题思路:使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表尾部时,慢指针指向链表的中间节点。指针从表头出发,如果节点数为偶数,则慢指针会指向中间两个节点中靠后的一个节点。
-
链表中倒数第k个节点:
给定一个单向链表的头节点和整数k,找到链表中倒数第k个节点:
解题思路:创建两个指针fast
和slow
,均指向头节点。先让fast
走k-1步,然后slow
和fast
一起每次走一步,当fast
走完时,slow
就指向倒数第k个节点。