最近写链表不太顺,无限的段错误。今天中午写的链表删除倒数第k项,用的带尾节点的双向链表,感觉已经把效率提到最高了,还是超时,改了很多方法都不行,最

终决定看博客,发现原来是审题错了,样例给的是以-1结束,我就天真的以为到-1结束,原来题目写的到负数结束,服了。。

先把我觉得最高效的代码贴上:思路是用带尾节点的双向链表存数据,在找倒数第k项时,如果超过表长,直接NULL,如果小于表长除以2,从尾指针往前找,如果大

于,从头指针往后找:

 //解法一:带尾节点的双向链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//using namespace std;
//输入数据,从尾节点,用prior指针向左移K-1位
//注意:遇到头结点,即为不存在,输出NULL #define OK 1
#define ERROR 0
//#define
typedef int ElemType;
typedef int Status; typedef struct DuLNode
{
ElemType data;
DuLNode *prior;//前驱
DuLNode *next;//后继
}DuLNode,*DuLink; typedef struct
{
DuLink head;//头指针
DuLink tail;//尾指针
int length;
}DuLinkList;//它是结构体类型 Status Create_DuL_ht(DuLinkList &L)//摸索
{
L.head=(DuLNode*)malloc(sizeof(DuLNode));
L.head->next=NULL;
L.head->prior=NULL;
L.tail=L.head;//应该是这么初始化吧
L.length=; DuLNode *cur=(DuLNode*)malloc(sizeof(DuLNode));//开新节点
cur->next=L.head;//指向头结点
scanf("%d",&cur->data);
while(cur->data>=)
{
cur->next=L.head;
L.tail->next=cur;
cur->prior=L.tail;
L.tail=cur;
L.head->prior=L.tail;
++L.length; cur=(DuLNode*)malloc(sizeof(DuLNode));
cur->next=L.head;
scanf("%d",&cur->data); } return OK; } Status CountBack_k(DuLinkList &L,int k)
{//用计数器从tail往前找,只要没遇到倒数第k项且没遇到头结点,就前移;
if(k>L.length)
{
printf("NULL");
return OK;
}
DuLNode *p;
if(k<L.length/)
{
int i=;
p=L.tail;
while(p!=L.head&&i<k)
{
p=p->prior;
++i;
} }
else
{
int i=;
p=L.head->next;
k=L.length-k+;
while(p!=L.head&&i<k)
{
p=p->next;
++i;
}
} printf("%d",p->data); return OK; } int main()
{
DuLinkList L;
int k;
scanf("%d",&k);
Create_DuL_ht(L);
//printf("%d",L.tail->prior->data);//创建函数没有错误
CountBack_k(L,k); return ;
}//

方法二是用伴随指针,让它与遍历指针相距k个结点,当遍历指针NULL,它就到了倒数第k项(这个方法是老师教的)

 /*
//解法二,普通单链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
//#define
typedef int ElemType;
typedef int Status; typedef struct LNode
{
ElemType data;
LNode *next;
}LNode,*LinkList; Status Creat_L(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL; LNode *rear,*cur;
rear=L;
cur=(LNode*)malloc(sizeof(LNode));
scanf("%d",&cur->data);//cin>>cur->data;
cur->next=NULL; while(cur->data!=-1)
{
rear->next=cur;
rear=cur; cur=(LNode*)malloc(sizeof(LNode));
scanf("%d",&cur->data);
cur->next=NULL; } return OK;
} Status CountBack_k(LinkList &L,int k)
{
LNode *p,*q;
p=L->next;
q=NULL;
int i=0;
while(p)
{
p=p->next;
i++;
if(i==k)
q=L->next;
if(i>k)
q=q->next; } if(q)
printf("%d",q->data);//cout<<q->data;
else
printf("NULL");//cout<<"NULL"; } int main()
{
LinkList L;
int k;
scanf("%d",&k);//cin>>k;
Creat_L(L);
//cout<<L->next->next->data;输入函数没问题
CountBack_k(L,k);
}//
*/

审题还是很重要的,不要看了样例就写啊。。。。。

链表实现比较高效的删除倒数第k项的更多相关文章

  1. 在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  2. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  3. 在单链表和双链表中删除倒数第K个节点

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...

  4. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  5. 链表中删除倒数第K个节点

    问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如 ...

  6. 链表问题----删除倒数第K个节点

    在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...

  7. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  8. 7-19 求链式线性表的倒数第K项

    7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...

  9. 算法总结之 在单链表和双链表中删除倒数第k个节点

    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...

随机推荐

  1. Entity Framework 6.0 入门系列 第一篇

    Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...

  2. mybatis嵌套map或者map嵌套的parameterType

    Spring的重要注解 https://www.cnblogs.com/rolandlee/p/11014923.html 一:首先是map嵌套: 例1: 例2: 总结: paramterType无论 ...

  3. 如何实现QQ附件在线预览功能

    方法一:使用 openoffice 的接口把文档转换成html (linux主机或者windows主机): 方法二:使用 一个叫 jacob.jar 的工具,在安装了 office 的windows主 ...

  4. 七缸发动机预热,docker swarm + .net core 高速飙车成功

    (图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...

  5. Keras实例教程(4)之迁移学习VGG

    https://blog.csdn.net/baimafujinji/article/details/80743814

  6. 随笔编号-12 阿里云CentOS7系列一 -- 安装JDK7的方法.

    最近因为数据采集以及生产环境冲突.导入windows Server 2008系统经常死机.经讨论决定把采集服务程序和生产服务进行分开.采集程序通过windows Server2008运行.而生产程序通 ...

  7. unity,C#,游戏面试笔试真题

    最开始的两家公司笔试面试题目 一家公司是学校聘请研究教育方面VR课件的公司,面试没几天,就收到了面试通过的消息,后面因为通过了另一家游戏公司而拒绝了. 另一家公司是一家游戏外企,在春熙路,当时笔试还可 ...

  8. spring-cloud-kubernetes的服务发现和轮询实战(含熔断)

    本文是<spring-cloud-kubernetes实战系列>的第四篇,主要内容是在kubernetes上部署两个应用:Web-Service和Account-Service,通过spr ...

  9. 学会spss就能找到数据分析工作吗

     大学课堂上学习了spss,老师也讲了很多知识,但是现在准备毕业了,我做的实习工作就是用业内的数据进行最新的行业研究.现在真正需要用到spss进行分析了,我却看不懂老板给的数据和分析要求,难道这就是理 ...

  10. Java深层复制方式

    为什么需要深层复制 Object 的 clone() 方法是浅层复制(但是 native 很高效).另外,Java 提供了数组和集合的复制方法,分别是 Arrays.copy() 和 Collecti ...