《剑指offer》22--链表中倒数第 K 个结点[C++]

NowCoder  

题目描述

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

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

解题思路

设链表的长度为 N。设置两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到第 N - K 个节点处,该位置就是倒数第 K 个节点。

《剑指offer》22--链表中倒数第 K 个结点[C++]_第1张图片

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        //if(k==0) return nullptr; //可有可无,只是当k==0时更快地执行完
        auto first = pListHead;
        for(unsigned int i=0; inext; 
            else return nullptr; //此处已经包含头指针为空的判断,链表结点数少于k的情况
        }
        auto second = pListHead;
        while(first) {
            first = first->next;
            second = second->next;
        }
        return second;
    }
};

可以放进一个循环体内

class Solution { 
    public: ListNode* FindKthToTail(ListNode* p, unsigned int k) {
        auto q1 = p, q2 = p; 
        unsigned int i = 0; 
        for (; q1; i++) { 
            if (i >= k) q2 = q2->next; 
            q1 = q1->next; 
        } 
        return i < k ? nullptr : q2; 
    } 
};

相关问题

删除链表的倒数第 n 个节点

LeetCode 19 答案

注:leetcode上的题目样例不足,该答案考虑情况比较完备

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto q1 = head, q2 = head; 
        unsigned int i = 0; 
        for (; q1; i++) { 
            if (i > n) q2 = q2->next; 
            q1 = q1->next; 
        } 
        if(i < n) return head;
        else if(i == n) return head->next;
        else q2->next = q2->next ? q2->next->next : nullptr;
        return head;
    }
};

 

你可能感兴趣的:(C++)