刷题日记—链表—快慢指针的应用

今天刷链表类的题目,碰到了几个快慢指针的题目:
1.删除倒数第k个节点:
题目:image
这个题目没有给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.中间节点的删除或返回
题目:image
代码:```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的位置
posted @ 2025-10-28 00:05  MaoS1mple  阅读(3)  评论(0)    收藏  举报