AcWing 33. 链表中倒数第k个节点

题目描述

输入一个链表,输出该链表中倒数第k个结点。

注意:

  • k >= 0;
  • 如果k大于链表长度,则返回 NULL;

样例

输入:链表:1->2->3->4->5 ,k=2

输出:4

问题分析 

首先判断头节点是否为空,如果为空则返回NULL,不为空再往后进行。由于删除倒数第k个节点,所以如果k等于链表的长度的话,那么把头节点向后移动k次,将恰好为NULL,这种情况下,倒数第k个节点就是头节点,所以返回头节点即可;如果头节点向后移动k次后不为NULL,则说明倒数第k个节点不是头节点,这时del指向的是头节点,所以进入循环:如果cur->next不为空,就同时向后移动cur节点和del节点,当cur->next为空时跳出循环,此时del指向的是倒数第k个节点的前一个节点,所以返回del->next。

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* findKthToTail(ListNode* pListHead, int k) {
        if(pListHead == NULL)
            return NULL;
        ListNode* del = pListHead;
        ListNode* cur = pListHead;
        for(int i = 0; i < k; i++){
            if(!cur)
                return NULL;
            cur = cur->next;  
        }
        if(cur == NULL)
            return pListHead;
        while(cur->next != NULL){
            del = del->next;
            cur = cur->next;   
        }
        return del->next;
    }
};


 

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/90049436