PTA 求链表的倒数第m个元素

6-7 求链表的倒数第m个元素 (20 分)

请设计时间和空间上都尽可能高效的算法,在不改变链表的前提下,求链式存储的线性表的倒数第m(>)个元素。

函数接口定义:

ElementType Find( List L, int m );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定的带头结点的单链表;函数Find要将L的倒数第m个元素返回,并不改变原链表。如果这样的元素不存在,则返回一个错误标志ERROR

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

#define ERROR -1

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

ElementType Find( List L, int m );

int main()
{
    List L;
    int m;
    L = Read();
    scanf("%d", &m);
    printf("%d\n", Find(L,m));
    Print(L);
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

5
1 2 4 5 6
3

输出样例:

4
1 2 4 5 6 

ElementType Find( List L, int m ){
    List p1,p2;
    p1=L->Next;
    p2=L->Next;
    int i=0;
    int flag=0;
    for(i=0;i<m;i++)
    {
        if(p2==NULL)
        {
            flag=1;
            break;
        }
        p2=p2->Next;
    }
    if(flag!=1)
    {
        while(p2)
        {
            p1 = p1->Next;
            p2 = p2->Next;
        }
            return p1->Data;
    }
    else
         return ERROR;

}
 

原文地址:https://www.cnblogs.com/DirWang/p/11929951.html

时间: 2024-11-03 18:27:08

PTA 求链表的倒数第m个元素的相关文章

浙大数据结构第二版 习题3.5 求链表的倒数第m个元素 答案错了一点

ElementType Find( List L, int m ) { List p1 = L; List p2 = L; List pLast = NULL; int c = 0; while (p1) { if (c == m) { p2 = L; } p1 = p1->Next; p2 = p2->Next; pLast = p2; c++; } if (c > m) return pLast->Data; else return -1; } ElementType Find

[CareerCup] 2.2 Kth to Last Element of Linked List 链表的倒数第k个元素

2.2 Implement an algorithm to find the kth to last element of a singly linked list. 这道题让我们求链表中倒数第k个元素,LeetCode中相类似的题目有Kth Largest Element in an Array 数组中第k大的数字 和 Kth Smallest Element in a BST 二叉搜索树中的第K小的元素.但那两道题和这题又不一样,首先这道题是要在链表中操作,链表的特点就是不能通过下标来直接访

求链表的倒数第N个节点

最近看一本书上有求链表的倒数第N个节点,简单实现了下 链表,实现方案如下 1.不借助链表长度顺序遍历倒数第N个节点 GetReserveN就是如此实现. 2.当然如果链表记录了节点长度也可以直接正序遍历出来 第lenth-N个节点就是倒数节点. template<class T> class LinkedList { public: operator T(){return m_data;} virtual ~LinkedList() { if(m_size!=0) Clear(); } voi

求链表的倒数第k个节点

问题描述:给定一个链表的头节点,求出链表的倒数第k个节点. 分析:这是链表里的经典问题,存在多种解法,下面给大家分享下我的想法. 解法一:很直观的一种做法是从头到尾扫描链表,然后求倒数第k个,但是由于单链表无法从尾部向头部扫描, 因此可以借助其他的辅助空间去存储扫描过的所有节点,例如,数组或栈均可. 解法二:计算出链表中节点的总数为n,根据k 将其转化为正数的第n-k+1个节点,然后在从链表头开始走n-k+1个节点,就是所求. 解法三:可以设置两个指针实现,假设两个指针分别为p1和p2,p1从链

12,求链表的倒数第k个节点《剑指offer》

题目: 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针一个先走k步,然后两个一起走,先走的到达终点时后一个指向的就是所求的节点,注意可能长度小于k,这时候应该返回null 代码: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListN

Q:链表的倒数第K个元素

问题:如何得到链表中的倒数第k个元素? ??一种简单的思路是遍历链表一遍,并统计出链表中节点的数目,然后计算出倒数第k个元素到链表头节点的元素的距离,然后得到对应的结果.但是,我们能否有一种更加简便的方式来得到倒数的第k个元素的结果呢?答案肯定有啦,不然我也不会总结成博文了.....哈哈哈哈~ ??具体的解题步骤如下: 初始化两个指针a和b,其均指向链表头节点. b指针先走k-1步 a指针和b指针均同时走一步 重复步骤3,直到b指针走到链表末尾节点,此时,a指针所指向的链表节点,即为其对应的链表

求链表中倒数第k个节点

注意鲁棒性和算法效率的典型例题:(头文件省略) typedef struct node { int data; struct node* next; }ListNode; ListNode* FindKthToTail(ListNode* pListHead, unsigned int k); int main() { int i; const int N = 50; ListNode *head, *p; //随机数种子 srand((unsigned int)time(0)); //生成链表

13输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4250795.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 题目分析: 1.链表的倒数第0个结点为链表的尾指针,设为r,则r指向最后一

[算法]找出单链表中的倒数第k个元素

找出单链表中的倒数第k个元素 解题思路: 为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. 如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素.设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链