java408单链表
时间: 2025-01-24 15:04:51 浏览: 33
### Java 408 单链表实现与常见问题
#### 链表节点个数计算
为了求取单链表中节点的数量,可以遍历整个链表并计数。每访问到一个新的节点,则增加计数值直到到达链表末端。
```java
public int size() {
Node current = head;
int count = 0;
while (current != null) {
count++;
current = current.next;
}
return count;
}
```
此方法能够有效地统计链表长度[^1]。
#### 查找倒数第 k 个节点
要找到链表中的倒数第 `k` 个节点,可以通过双指针法来完成这一目标。先让第一个指针向前移动 `k` 步,随后两个指针同步前进直至前导指针抵达终点位置;此时跟随指针所指向的就是所需的结果节点。
```java
public ListNode findKthFromEnd(int k) {
if (head == null || k <= 0) {
throw new IllegalArgumentException("Invalid input");
}
ListNode fast = head, slow = head;
// Move the fast pointer ahead by 'k' steps.
for (int i = 0; i < k && fast != null; ++i) {
fast = fast.next;
}
// If there are less than 'k' nodes in list then it's an error case.
if (fast == null && i < k) {
throw new NoSuchElementException();
}
// Now move both pointers until we reach end of linkedlist.
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
```
这种方法利用了两次迭代过程完成了任务,在时间复杂度上达到了 O(n)。
#### 反转单向链表
反转单链表意味着改变各节点之间的连接方向,使得原本的尾部成为新的头部。具体做法是从头至尾依次处理每个节点,并将其 next 字段重新设置为其前置节点。
```java
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode tempNext = curr.next;
curr.next = prev;
prev = curr;
curr = tempNext;
}
return prev;
}
```
这段代码展示了如何高效地执行链表翻转操作[^3]。
#### 逆序打印链表
如果想要按照相反顺序输出链表元素,可以选择递归方式或是借助栈这种先进后出的数据结构来进行辅助存储再逐项弹出来显示。
采用递归的方式:
```java
private void printReverseRecursive(Node node) {
if(node==null)
return ;
printReverseRecursive(node.next);
System.out.print(node.data+" ");
}
```
上述函数会一直深入调用自己直到遇到终止条件(即当前节点为空),之后才开始真正意义上的打印工作。
阅读全文
相关推荐













