【2009年真题】返回单链表倒数第k个结点的值。(定义两个指针,取相对距离为k,遍历一次)

  1. 算法设计思想:设置两个LNode*的指针p、q初始指向Seqlist L 的头节点的下一个位置(带头结点的单链表),先移动p节点,q不动,设置count记录与p的相对位置,当count<k是只移动p,直到count==k时,下一次及以后p与q一起后移,直到p指向NULL时循环停止,此时q所指向的结点即为所求,打印输出该节点的data域。

  1. 算法详细步骤:

①count=0;p和q指向链表头节点的下一个结点

②若count<k&&p!=NULL,则count++;p指向p的下一个结点,q不动

③若count==k&&p!=NULL则p和q一起向前

④若count<k&&p指向NULL说明查找失败返回false

⑤若count==k且p指向NULL说明查找成功,输出q的data域

  1. 给出算法实现:

(考试写的代码片段)://注意写在main的外面

typedef int Elemtype;
typedef struct LNode
{
    Elemtype data;
    struct LNode* link;
}LNode, * LinkList;
bool search_k(LinkList L, int k)
{
    LNode* p = L->link, * q = L->link;
    int count = 0;
    while (p != NULL)
    {
        if (count < k)
        {
            count++;
            p = p->link;
        }
        else
        {
            p = p->link;
            q = q->link;
        }
    }
    if (count < k)return false;
    else
    {
        cout << q->data;
        return true;
    }
}

(可以执行的完整代码):

"linklist.hpp"文件(核心代码在此):

#pragma once
#include<string>
#include <ctime>
#include <iostream>
using namespace std;



typedef struct LNode//链式实现的线性表的节点Node定义
{
    int data;
    LNode* next;
}LNode,*Linklist;


class Seqlist//链式实现的线性表
{
    
public:
    void Initlist(int len);

    void printlist();

    bool search_rek_elem(int k);//查找倒数第k个节点
    


private:
    LNode* first;//链表头指针,带头结点
};


void Seqlist::Initlist(int len)
{
    this->first = new LNode;
    this->first->data = len;//链表长度
    this->first->next = NULL;//指向头节点
    for (int i = 0; i < len; i++)
    {
        LNode* n = new LNode;
        n->data = rand() % 61;
        n->next = this->first->next;
        this->first->next = n;
    }

}

void Seqlist::printlist()
{
    LNode* p = this->first->next;
    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }

}

bool Seqlist::search_rek_elem(int k)//查找倒数第k个节点
{
    LNode* p = this->first->next;//线性表的首元素为头节点的next指向节点
    LNode* q = this->first->next;
    int count = 0;
    while (p != NULL)//没到表尾则循环遍历
    {
        if (count < k)
        {
            p = p->next;
            count++;
        }
        else
        {
            p = p->next;
            q = q->next;
        }
    }
    if (count < k)return false;
    else
    {
        cout << "链表倒数第k个节点为:" << q->data << endl;

        return true;
    }

}

源文件:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdbool.h>
#include "seqlist.hpp"



int main()
{
    srand((unsigned)time(NULL));

    Seqlist L;
    int len,k;
    cout << "请输入您要创建的链接表长度:";
    cin >> len;
    L.Initlist(len);
    L.printlist();

    cout << "\n请输入您要查询的倒数第k个节点k=";
    cin >> k;
    L.search_rek_elem(k);


    

    system("pause");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值