最近写链表不太顺,无限的段错误。今天中午写的链表删除倒数第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. lnmp环境搭建方法

    网上目前的一键搭建方法: 命令行安装: 1.源码编译安装:(个性化配置,安装配置过程繁琐) 2.使用yum或apt直接安装:(使用编译好的二进制文件安装,速度快) 3.军哥的lnmp一键脚本安装: 4 ...

  2. 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    转载注明:http://dwz.win/gHc 最近网上出现一个美团面试题:"一个线程OOM后,其他线程还能运行吗?".我看网上出现了很多不靠谱的答案.这道题其实很有难度,涉及的知 ...

  3. jmeter+WebDriver:启动浏览器进行web自动化

    无论是web自动化还是手机app自动化,WebDriver是Selenium的核心模块,jmeter WebDriver 仅支持Firefox.Chrome 和 HTML Unit驱动,暂不支持IE  ...

  4. 2019基于Hexo快速搭建个人博客,打造一个炫酷博客(1)-奥怪的小栈

    本文转载于:奥怪的小栈 这篇文章告诉你如何在2019快速上手搭建一个像我一样的博客:基于HEXO+Github搭建.并完成SEO优化,打造一个炫酷博客. 本站基于HEXO+Github搭建.所以你需要 ...

  5. SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用

    1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...

  6. 使用synchronized获取互斥锁的几点说明

    在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确 ...

  7. 使用css实现水平垂直居中

    1.通过absolute和margin实现(适用于弹窗,具体位置随浏览器屏幕大小变化改变)这种方式需要居中元素的父级必须采用绝对定位或相对定位,被居中元素的尺寸需要固定. <div class= ...

  8. Oracle数据库测试和优化最佳实践: OTest介绍 (转)

    当前Oracle数据库最佳测试工具OTest *  Otest是用于Oracle数据库测试.优化.监控软件. *  Otest是免费提供给Oracle客户和广大DBA工程师使用的软件.由原厂技术专家王 ...

  9. 步入vue.js世界

    一.遇见vue.js 1.1 Vue.js是什么? Vue.js 是一套用于构建用户界面的渐进式框架,Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合.Vue.js通过简单的 ...

  10. POJ-2253-Frogger +最短路小变形

    传送门:http://poj.org/problem?id=2253 参考:https://www.cnblogs.com/lienus/p/4273159.html 题意:给出一个无向图,求一条从 ...