题解 | #找出单向链表中的一个节点到尾指针的距离为K#
找出单向链表中的一个节点,该节点到尾指针的距离为K
https://www.nowcoder.com/practice/0cff324157a24a7a8de3da7934458e34
题解 | #找出单向链表中的一个节点,该节点到尾指针的距离为K#
#include <bits/stdc++.h>
using namespace std;
struct ListNode {
int m_nKey;
ListNode* m_pNext;
ListNode(int x): m_nKey(x), m_pNext(NULL){} // listnode[i] 直接赋
};
ListNode* creatList(const vector<int>& arr) {
if (arr.empty())
return nullptr;
ListNode* head, *cur, *pre; // 三个指针 完成初始化
head = new ListNode(1); // new了一个head 链表对象 int = 1 完成初始化
pre = head;
for (int i = 2; i < arr.size(); i++) {
cur = new ListNode(i);
pre->m_pNext = cur; // 其实pre起一个中间媒介的作用,他在初始的时候代表的是head,在for里面 他每次帮助传递地址后,又成为cur 如此以往。
pre = cur; //链表之间的作用是不紧密的 只要有地址即可
}
return head;
}
int solve(ListNode* head, int k) {
ListNode* slow, *fast;
slow = fast = head;
for (int i = 1; i <= k; i++)
fast = fast->m_pNext;
while (fast) {
fast = fast->m_pNext; // fast 先走k个,这样当fast指空时,slow正好到了倒数第k个的前面一个
slow = slow->m_pNext;
}
return slow->m_nKey;
}
int main() {
vector<int> arr(8, 0);
int k;
for (int i = 1; i <= 7; i++) //其实不用如此
arr[i] = i;
cin >> k;
ListNode* head = creatList(arr);
cout << solve(head, k);
return 0;
}