2009年408考研算法题

题目

已知一个带有表头结点的单链表,结点结构为

datalink

假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数)。若查找成功,算法输出该结点的data值,并返回1;否则,只返回0。要求:

题解

分析

1. 带头结点的单链表

首先,链表是一种线性表,在每一个节点里存到下一个节点的指针。
其次,区分 头结点和头指针

  • 头结点:有时,在链表的第一个结点之前会额外增设一个结点,结点的数据域一般不存放数据(有些情况下也可以存放链表的长度等信息),此结点被称为头结点。
    若头结点的指针域为空(NULL),表明链表是空表。头结点对于链表来说,不是必须的,在处理某些问题时,给链表添加头结点会使问题变得简单。

  • 头指针:永远指向链表中第一个结点的位置(如果链表有头结点,头指针指向头结点;否则,头指针指向首元结点)。

2. 结点结构

data为数据域,存放数据元素。link为指针域,存放后继结点的地址
单链表下,结点类型代码:

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

3. 头指针list

题目:已存在一个单链表,但只知道该链表的头指针,其余未知。

4. 查找倒数第k个结点

此时,可使用的信息只有:头指针list和位置k
算法:设置两个头指针,其中一个先移动k-1,然后同时移动到最后,剩下的一个指针就是倒数第k个位置

代码

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

int search(LinkList L, ElemType k){
    LNode *p = L->next;
    LNode *q = L->next;

    while(p->next!=NULL){
        if(k>1){
            p = p->next;
            k--;
        }
        p = p->next;
        q = q->next;
    }
//此时,q是倒数第k个结点的指针
//查找失败的情况:k>链表长度,即p指针移动到链表末尾,k值没有减完
    if(k>1){
        return 0;
    }
    cout<<q->data;
    return 1;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shaun善逸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值