刷题日记—链表—快慢指针的应用
今天刷链表类的题目,碰到了几个快慢指针的题目:
1.删除倒数第k个节点:
题目:
这个题目没有给size,所以无法遍历,这时候就要借助快慢指针.
代码如下:
class Solution {
public:
int kthToLast(ListNode* head, int k) {
ListNode* fast=head;
ListNode* slow=head;
while(k--){
fast=fast->next; //走了k步,指向k+1
}
while(fast){
fast=fast->next; //走了n-k步,指向NULL,从k到n要走n-k步,从k+1走向n+1即NULL也要走n-k步
//即从a到b要走b-a步
slow=slow->next;//走了n-k步,指向n-k+1,恰好是倒数第k个位置
}
return slow->val;
}
};
2.中间节点的删除或返回
题目:
代码:```cpp
/**
-
Definition for singly-linked list.
-
struct ListNode {
-
int val; -
ListNode *next; -
ListNode() : val(0), next(nullptr) {} -
ListNode(int x) : val(x), next(nullptr) {} -
ListNode(int x, ListNode *next) : val(x), next(next) {} -
};
/
class Solution {
public:
ListNode middleNode(ListNode* head) {
ListNode* fast=head;
ListNode* slow=head;
while(fast){
fast=fast->next;
if(fast==NULL){
return slow;} fast=fast->next; if(fast==NULL){ return slow->next; }slow=slow->next;
}return NULL;
}
};
采用快2慢1的方法来获取中间节点,由于快指针走到n时,慢指针恰好走到n/2的位置
浙公网安备 33010602011771号