剑指offer 链表中倒数第k个结点

题目描述:
输入一个链表,输出该链表中倒数第k个结点。
(hint: 请务必使用链表。)

思路:
单向链表,故不能倒着来,我们可以定义两个指针p1,p2,对于倒数第k个,我们先令p1走k步,然后两个指针一起走,如果p1到了结尾,则p2所对应的值就是所求。

#include <cstdio>
using namespace std;

typedef struct Node{
    int val;
    Node *next;
    Node(int val = -1) : val(val), next(NULL) {}
}*pNode;

class List{
private:
    pNode Head;
    pNode Tail;
    int List_Size;
    void Delete_List(pNode);
public:
    void Delete_Content();
    int Find(int x);
    void Insert_Node(int x);
    List();
    ~List();
};

void List::Insert_Node(int x){
    Node *node = new Node(x);
    List_Size++;
    this->Tail->next = node;
    this->Tail = node;
}

int List::Find(int x){
    if(x <= 0 || x > List_Size)
        return -1;
    pNode p1 = this->Head->next, p2 = this->Head->next;
    for(int i = 0; i < x; i++)
        p1 = p1->next;
    while(p1){
        p1 = p1->next;
        p2 = p2->next;
    }
    return p2->val;
}

void List::Delete_Content(){
    pNode p = this->Head->next;
    while(p){
        pNode child = p->next;
        delete p;
        p = child;
    }
    this->Head->next = NULL;
    this->Tail = this->Head;
    List_Size = 0;
}

void List::Delete_List(pNode node){
    if(node){
        Delete_List(node->next);
        delete node;
    }
}

List::List(){
    Head = Tail = new Node();
    List_Size = 0;
}

List::~List(){
    Delete_List(this->Head);
}

int main()
{
    int n, x;
    int v;
    List *list = new List;
    while(scanf("%d%d", &n, &x) != EOF){
        for(int i = 0; i < n; i++){
            scanf("%d", &v);
            list->Insert_Node(v);
        }
        int ans = list->Find(x);
        if(ans == -1)
            printf("NULL\n");
        else
            printf("%d\n", ans);
        list->Delete_Content();
    }
    delete list;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值