最近写链表不太顺,无限的段错误。今天中午写的链表删除倒数第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. 在Android Studio配置google protobuf

    1.在project的build.gradle中配置 buildscript { repositories { jcenter() mavenCentral() } dependencies { cl ...

  2. 如何处理scrum中未完成的用户故事?

    你听过柏林新建机场的故事吗?机场原定2006年开工,2007年启用,但由于机场建设过程中到处出现施工和安全问题,补东墙漏西墙,导致工期一拖再拖,预算一涨再涨,以至于2019年了还没开张,预计开业时间已 ...

  3. spring-boot-plus运维部署(八)

    spring-boot-plus运维部署 线上部署 打包环境为prod mvn clean package -Pprod 打包后的目录 cd target/spring-boot-plus-1.2.0 ...

  4. 【JVM从小白学成大佬】开篇

    JVM的重要性毋庸置疑,可以毫不夸张的说Java虚拟机是整个Java平台的基石. JVM方面的知识,也一直是BAT等大厂面试考核的重点.特别是JVM调优,故障排查性能调优,你知道该从哪些方面入手吗? ...

  5. 谷歌移动UI框架Flutter教程之Widget

    引言 在之间我已经介绍了关于Flutter的下载安装以及配置,还有开发工具Android Studio的配置,还不知道的同学可以看看我这篇博客--谷歌移动UI框架Flutter入门.这里为什么非要用A ...

  6. 开发人员需要掌握的日常Linux命令集

    本文整理了开发人员日常用到的linux相关命令,供参考. 文件相关 cd # 进入某个目录,不接参数进入当前用户目录(等同于cd ~)如/home/devuser,可接绝对路径或相对路径(../..表 ...

  7. RANSAC简史

    前言 在进行泡泡机器人[图灵智库]栏目的翻译的过程中,我发现在2018-2019的顶会中,依然有很多文章(我看到的不少于6篇)对RANSAC进行各种改进,这令我感到很吃惊.毕竟该方法在1981年就被提 ...

  8. time_wait状态如何处理和建议

    TL;DR: do not enable net.ipv4.tcp_tw_recycle. UPDATED (2017.09): net.ipv4.tcp_tw_recycle has been re ...

  9. d3.js制作蜂巢图表带动画效果

    以上是效果图,本图表使用d3.js v4制作.图表主要功能是在六边形格子中显示数据,点击底部图标可以切换指定格子高亮显示,图表可以随浏览器任意缩放. 1.图表的主体结构是由正六边形组成,使用d3生成六 ...

  10. 本地图片上传到GitHub,MarkDown使用Github图片地址

    最近在学习用markdown编辑器,我是直接用有道云笔记编辑的,感觉真的好好用,编辑了一半的博客,可以按样式保存在云笔记中,我再也不会忘记写博客了~~ 但是在编辑博客的时候发现了一个问题,那就是本地图 ...