链表实现比较高效的删除倒数第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 ...
随机推荐
- monkey学习总结笔记
一.什么是monkey? Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...
- 并发编程 Semaphore的使用和详解
类Semaphore的基本使用 Semaphore的作用:限制线程并发的数量 课外话题[多线程的同步概念]:其实就是排着队去执行一个任务,执行任务是一个一个的执行,这样的优点是有助于程序逻辑的正确性, ...
- JMeter使用JSON Extractor插件实现将一个接口的JSON返回值作为下一个接口的入参
##补充## 接口响应数据,一般为JSON,HTML格式的数据. 对于HTML的响应结果提取,可以使用正则表达式,也可以通过XPath来提取:对于JSON格式的数据,可以用正则表达式,JSON Ext ...
- HDFS介绍~超详细
HDFS(Hadoop Distributed File System) (1) HDFS--Hadoop分布式文件存储系统 源自于Google的GFS论文,HDFS是GFS的克隆版 HDFS ...
- 三维动画形变算法(Linear rotation-invariant coordinates和As-Rigid-As-Possible)
在三维网格形变算法中,个人比较喜欢下面两个算法,算法的效果都比较不错, 不同的是文章[Lipman et al. 2005]算法对控制点平移不太敏感.下面分别介绍这两个算法: 文章[Lipman et ...
- 支持向量机 (一): 线性可分类 svm
支持向量机(support vector machine, 以下简称 svm)是机器学习里的重要方法,特别适用于中小型样本.非线性.高维的分类和回归问题.本系列力图展现 svm 的核心思想和完整推导过 ...
- Spring框架入门之基于Java注解配置bean
Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...
- 用jquery uploadify上传插件上传文件
public void ProcessRequest(HttpContext context) { string esOIDs = System.Web.HttpContext.Current.Req ...
- 在windows7系统下如何查看及升级powershell到3.0版本
最近在学习.net core web api 开发,用到了Mysql.Data.EntityFrameworkCore框架,在根据数据库表生成对应实体类时提示必须先升级本机powershell到3.0 ...
- node.js常用的全局成员和对象
一般可以直接调用的对象,我们称之为全局对象: 一下对象都加了console.log(),以在运行环境中的显示效果为标准 //包含文件名称的全路径: console.log(_filename); ...