链表实现比较高效的删除倒数第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 ...
随机推荐
- SpringCloud微服务小白入门之Eureka注册中心和服务中心搭建示例
一.注册中心配置文件 代码复制区域: spring: application: name: spring-cloud-server server: port: 7000 eureka: instanc ...
- python(自用手册)导图
- 开源题材征集 + MVC&EF Core 完整教程小结
到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...
- 携程PMO--如何召开卓有成效的回顾会
话题介绍 回顾会提供团队反思迭代过程并提出改进措施的机会.回顾会是团队成员共同进行的协作活动,让团队成员跟进并落实改进措施,使团队在下一个冲刺中更高效,这是相当重要的. 我们给出了回顾会的 ...
- CSS3 transform封装
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Azure Devops: COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx.csproj no such file or directory
在Azure Devops中部署docker镜像时, 出现COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx. ...
- Python Web 之 Flask
FLASK 一.概述 flask是一个基于python并依赖于Jinja2模板引擎和WerkZeug WSGI(Web Server Gatewey InterFace.web)服务的框架 WSGI: ...
- HTML 事件属性(摘自菜鸟教程)
HTML 事件属性 全局事件属性 HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 如果你想学习更多关于事件 ...
- ASP.NET Core 3.0中使用动态控制器路由
原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...
- Calendar常用方法
import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class C ...