在单链表和双链表中删除倒数第K个节点
【说明】:
本文是左程云老师所著的《程序员面试代码指南》第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现。
本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。
感谢左程云老师的支持。
【题目】:
分别实现两个函数,一个可以删除单链表中倒数第 K 个节点,另一个可以删除双链表中倒数第 K 个节点。
【要求】:
如果链表长度为 N,时间复杂度达到 O(N),额外空间复杂度达到 O(1)。
【思路】:
在确定待删除节点的位置有一个小技巧,大家可以看代码推断,也可以翻看左老师的原书奥。
【编译环境】:
CentOS6.7(x86_64)
gcc 4.4.7
【实现】:
实现及测试代码:
/*
*文件名:lists_delLastKth.cpp
*作者:
*摘要:删除单链表或双链表的倒数第 K 个节点
*/ #include <iostream> using namespace std; struct SingleNode
{
int value;
SingleNode *next;
}; struct DoubleNode
{
int value;
DoubleNode *pre;
DoubleNode *next;
}; SingleNode* removeLastKthNode(SingleNode *head,int lastKth)
{
if(NULL == head || > lastKth)
return head;
SingleNode *cur = head;
while( NULL != cur)
{
lastKth--;
cur = cur->next;
}
if( == lastKth)
{
cur = head;
head = head->next;
delete cur;
}
if( > lastKth)
{
cur = head;
while(++lastKth != )
cur = cur->next;
SingleNode *tmp = cur->next;
cur->next = tmp->next;
delete tmp;
}
return head;
} DoubleNode* removeLastKthNode(DoubleNode *head,int lastKth)
{
if(NULL == head || > lastKth)
return head;
DoubleNode *cur = head;
while( NULL != cur)
{
lastKth--;
cur = cur->next;
}
if( == lastKth)
{
cur = head;
head = head->next;
head->pre = NULL;
delete cur;
}
if( > lastKth)
{
cur = head;
while(++lastKth != )
cur = cur->next;
DoubleNode *tmp = cur->next;
cur->next = tmp->next;
if(NULL != tmp->next)
tmp->next->pre = cur;
delete tmp;
}
return head;
} int main()
{
SingleNode *shead = NULL;
SingleNode *sptr;
DoubleNode *dhead = NULL;
DoubleNode *dptr;
for(int i =;i<;i++)
{
if(NULL == shead && NULL == dhead)
{
//单链表
shead = new SingleNode;
shead->value = i;
shead->next = NULL;
sptr = shead;
//双链表
dhead = new DoubleNode;
dhead->value = i;
dhead->next = NULL;
dhead->pre = NULL;
dptr = dhead;
continue;
}
//单链表
sptr->next = new SingleNode;
sptr = sptr->next;
sptr->value = i;
sptr->next = NULL;
//双链表
dptr->next = new DoubleNode;
dptr->next->pre = dptr;
dptr = dptr->next;
dptr->value = i;
dptr->next = NULL;
}
int k = ;
cout << "Single linked list before remove last " << k << "th data: " << endl;
sptr = shead;
while(NULL != sptr)
{
cout << sptr->value << " ";
sptr = sptr->next;
}
cout << endl;
cout << "Double linked list before remove last " << k << "th data: " << endl;
dptr = dhead;
while(NULL != dptr)
{
cout << dptr->value << " ";
dptr = dptr->next;
}
cout << endl; removeLastKthNode(shead,k);
removeLastKthNode(dhead,k); sptr = shead;
dptr = dhead;
cout << "Single linked list after removed: " << endl;
while(NULL != sptr)
{
cout << sptr->value << " ";
sptr = sptr->next;
}
cout << endl;
cout << "Double linked list after removed: " << endl;
while(NULL != dptr)
{
cout << dptr->value << " ";
dptr = dptr->next;
}
cout << endl;
return ;
}
【说明】:
这个算法不难,我写的测试代码(main 函数)较为麻烦,大家理解哈。
注:
转载请注明出处;
转载请注明源思路来自于左程云老师的《程序员代码面试指南》。
在单链表和双链表中删除倒数第K个节点的更多相关文章
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 链表中删除倒数第K个节点
问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如 ...
- 算法总结之 在单链表和双链表中删除倒数第k个节点
分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...
- 在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- [算法]在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- 链表问题----删除倒数第K个节点
在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
- 链表实现比较高效的删除倒数第k项
最近写链表不太顺,无限的段错误.今天中午写的链表删除倒数第k项,用的带尾节点的双向链表,感觉已经把效率提到最高了,还是超时,改了很多方法都不行,最 终决定看博客,发现原来是审题错了,阳历给的是以-1结 ...
- 1.求链表中的倒数第K个节点
注意事项:1.要是K大于链表长度怎么办? 2.k<=0怎么办? ListNode* FindR_Kth(ListNode* p_head, unsigned int k) 2 {//找到链表的倒 ...
随机推荐
- 运行JBoss 5.1.0 GA时出现Error installing to Instantiated:name=AttachmentStore state=Described错误的解决办法
第一次开JBoss服务器:有些时候会遇到这种情况:把以下的文字替换即可 进到类似目录 server/default/conf/bootstrap,打开文件 profile.xml找到: Xml代码 & ...
- 块对象block小结(2)
MRC环境下 //// main.m// blcok//// Created by ios on 16/4/6.// Copyright © 2016年 ios. All rights res ...
- android Fragment相关概念简介
Fragment 详细介绍连接:http://blog.csdn.net/harvic880925/article/details/44927375 fragment是一种控制器对象,activity ...
- Java 动态代理(转)
一.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后 处理消息等.代理类与委托类之间通常会存在 ...
- 对Java的Map的Value字段进行排序
构造TreeMap可以指定Comparator,但是不能对value字段进行排序.如果有需求对Value字段排序,例如map存放的是单词,单词出现次数,怎么按单词次数排序呢? 可以先将map中的key ...
- hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)
Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种 ...
- PHP用户登录与注册页面
PHP用户登录模块实现 项目包含的功能脚本: login.php//登录 reg.php//注册用户 user_add.php//注册校验脚本 user_login_check.php//登录校验脚本 ...
- [LeetCode]题解(python):141-Linked List Cycle
题目来源: https://leetcode.com/problems/linked-list-cycle/ 题意分析: 给定一个链表,判断链表是否有环.要求O(1)空间时间复杂度. 题目思路: 用快 ...
- UPPH、UPH
UPPH=units Per Hour Per Person,单位小时人均产能,是公司作为衡量员工工作绩效的重要指标. UPPH是衡量员工单位时间工作量的一种绩效指标. UPPH计算方式如下: UPP ...
- 双线服务器和CDN的区别
双线机房是在国内这样特殊的网络环境下特有的产物,双线机房只能解决网通和电信访问瓶颈的问题,网络传输中的链路问题和其它各ISP互通问题还是没有得到解决. CDN的原理是边缘访问,访问者就近取数据,这样大 ...