输出单向链表倒数第k个结点(HJ51)

一:解题思路

这道题目和leetode 19 有些类似,可以放在一起进行学习。这个题目需要自己创建单链表,并且还有倒数第0个,这个我个人认为没有必要。我保持和leetcode 19一样的写法。

二:完整代码示例 (C++版和Java版)

C++代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

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

ListNode* removeNthFromEnd(ListNode* head, int n) 
{
    if (head == NULL || n <= 0) return head;
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* p = dummy;
    ListNode* q = dummy;

    for (; q->next != NULL && n > 0; n--) q = q->next;
    if (n != 0) return dummy->next;

    while (q->next != NULL)
    {
        p = p->next;
        q = q->next;
    }

    //p->next = p->next->next;

    return  p->next;
}


int main()
{
    int n = 0;

    while (cin >> n)
    {
        int temp = 0;
        ListNode* head = NULL;
        ListNode* slider = NULL;

        for (int i = 0; i < n; i++)
        {
            cin >> temp;
            ListNode* node = new ListNode(temp);

            if (slider == NULL)
            {
                slider = node;
                head = node;
            }
            else
            {
                slider->next = node;
                slider = node;
            }
        }

        int k = 0;
        cin >> k;

        ListNode* result = removeNthFromEnd(head,k);

        cout << result->val << endl;
    }

    return 0;
}

 

posted @ 2020-08-04 16:18  repinkply  阅读(346)  评论(0)    收藏  举报