链表实现比较高效的删除倒数第k项
最近写链表不太顺,无限的段错误。今天中午写的链表删除倒数第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项的更多相关文章
- 在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- [算法]在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- 在单链表和双链表中删除倒数第K个节点
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 链表中删除倒数第K个节点
问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如 ...
- 链表问题----删除倒数第K个节点
在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...
- 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...
- 7-19 求链式线性表的倒数第K项
7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...
- 算法总结之 在单链表和双链表中删除倒数第k个节点
分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...
随机推荐
- Python爬虫视频教程
├─第1章_[第0周]网络爬虫之前奏 │ ├─第1节_"网络爬虫"课程内容导学 │ │ 第1部分_全课程内容导学.mp4 │ │ 第2部分_全课程内容导学(WS00单元)学习资料. ...
- SpringBoot内置tomcat启动原理
前言 不得不说SpringBoot的开发者是在为大众程序猿谋福利,把大家都惯成了懒汉,xml不配置了,连tomcat也懒的配置了,典型的一键启动系统,那么tomcat在springb ...
- 终于找到可以一文多发的平台了! openwrite.cn
openwrite.cn 一文多发平台 有时候自己辛苦写了几个小时的技术文章,被爬虫抓走.自己去全平台一个一个发,又过于麻烦.而且每个平台都不一样,发文同步很困难.那么终于有了一款一文多发的利器:Op ...
- 一文看尽Java-Thread
一.前言 主要分成两部说起:Thread源码解读和常见面试题解答,废话不多说开始: 二.源码解读 首先看下构造函数,构造函数都是通过调用init方法对属性进行初始化,主要是对线程组.线程名字 ...
- iOS仿写下厨房
把之前简书的博客搬到博客园了,还是放在一个地方看着舒服. 先看一下做的效果,是不是还不错?(可以看一下早餐那块的轮播,上面盖着一个都是点点的图片,但是它不是和轮播一起滚动的,是盖在轮播上面的,需要在那 ...
- 问题.spring源码转换为eclipse遇到的问题
1.下载spring源码 2.下载安装gradle,配置环境变量 3.在spring子项目下执行命令:gradle cleanidea eclipse,会生成对应的.project及.classpat ...
- Spring源码解析之ConfigurableApplicationContext
UML图 接口的作用 从上面的UML图中,可以看到 ConfigurableApplicationContext 直接继承了 ApplicationContext, Lifecycle, Closea ...
- [python]打开文件操作open用法
1. 格式 handle = open(file_name, access_mode = 'r') file_name: 希望打开的文件名 access_mode: 'r'表示读取,'w'表示写入,' ...
- POJ - 3026 Borg Maze BFS加最小生成树
Borg Maze 题意: 题目我一开始一直读不懂.有一个会分身的人,要在一个地图中踩到所有的A,这个人可以在出发地或者A点任意分身,问最少要走几步,这个人可以踩遍地图中所有的A点. 思路: 感觉就算 ...
- ECfinal-D-Ice Cream Tower-二分+贪心
传送门:https://vjudge.net/problem/Gym-101194D 题意:在一堆数中,找到对多的组合,使得每个组合的个数为K,且满足在排序后,后一个是前一个的两倍: 思路:二分,贪心 ...