链表 | 倒数第k个节点

问题:定位倒数第k个节点

链接
在这里插入图片描述

解题思路

双指针法,开始时p1,p2都指向头节点,先让p2走k步,然后p1和p2一起走,当p2指向NULL时,p1就指向倒数第k个节点了

C++代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getKthFromEnd(ListNode* head, int k) {
        ListNode *p1 = head, *p2 = head;
        //先让p2走k步
        for(int i = 1; i <= k; i++) p2 = p2->next;
    //再让 p1和p2 一起走,当p2指向NULL时,p1就指向倒数第k个节点
        while(p2){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p1;
    }
};

问题:删除倒数第k个节点

链接
问题描述

解题思路

双指针法,开始时p1,p2都指向头节点,先让p2走N步,然后p1和p2一起走,当p2指向NULL时,p1就指向倒数第N个节点了,将p1进行删除,考虑到p1指向头节点,因此我们再使用pre指向p1的前一个结点。

C++代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *p1 = head, *p2 = head;  //初始p1和p2都指向第一个元素
        for(int i=1; i <= n; i++) p2 = p2->next; //让p2指向第n+1个元素
        ListNode *pre = NULL;//pre指向p1前面一个结点
        while(p2){ //当p2指针指向NULL时,p1指针就指向倒数第n个节点
            pre = p1;
            p1 = p1->next;
            p2 = p2->next;
        }
        if(pre){
            pre->next = p1->next;
        }
        else{//待删除节点p1是根节点,删除后p1下一个结点是新的根节点
            head = p1->next;
        }
        delete p1;//释放待删除元素所占空间
        return head;
    }
};
发布了860 篇原创文章 · 获赞 270 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/SongBai1997/article/details/104652005