题目
题目链接
解题思路
- 题目要求找出链表倒数第
k
k
k 个节点,可以使用快慢指针法:
- 快指针先走
k
k
k 步
- 然后快慢指针同时走
- 当快指针到达末尾时,慢指针正好在倒数第
k
k
k 个位置
- 需要注意的边界条件:
- 链表长度
n
n
n 的范围:
1
≤
n
≤
1000
1 \leq n \leq 1000
1≤n≤1000
-
k
k
k 的范围:
k
≤
n
k \leq n
k≤n
- 节点值的范围:
0
≤
val
[
i
]
≤
10000
0 \leq \text{val}[i] \leq 10000
0≤val[i]≤10000
代码
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
int main() {
int n;
while (cin >> n) {
ListNode* dummy = new ListNode(0);
ListNode* curr = dummy;
for (int i = 0; i < n; i++) {
int val;
cin >> val;
curr->next = new ListNode(val);
curr = curr->next;
}
int k;
cin >> k;
ListNode* fast = dummy->next;
ListNode* slow = dummy->next;
for (int i = 0; i < k - 1; i++) {
fast = fast->next;
}
while (fast->next != nullptr) {
fast = fast->next;
slow = slow->next;
}
cout << slow->val << endl;
while (dummy != nullptr) {
ListNode* temp = dummy;
dummy = dummy->next;
delete temp;
}
}
return 0;
}
import java.util.*;
public class Main {
static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
for (int i = 0; i < n; i++) {
curr.next = new ListNode(sc.nextInt());
curr = curr.next;
}
int k = sc.nextInt();
ListNode fast = dummy.next;
ListNode slow = dummy.next;
for (int i = 0; i < k - 1; i++) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
System.out.println(slow.val);
}
}
}
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
while True:
try:
n = int(input())
values = list(map(int, input().split()))
k = int(input())
dummy = ListNode(0)
curr = dummy
for val in values:
curr.next = ListNode(val)
curr = curr.next
fast = dummy.next
slow = dummy.next
for _ in range(k - 1):
fast = fast.next
while fast.next:
fast = fast.next
slow = slow.next
print(slow.val)
except EOFError:
break
算法及复杂度
- 算法:快慢指针法
- 时间复杂度:
O
(
n
)
\mathcal{O}(n)
O(n) - 需要遍历一次链表
- 空间复杂度:
O
(
1
)
\mathcal{O}(1)
O(1) - 只使用了常数额外空间