在单链表和双链表中删除倒数第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 {//找到链表的倒 ...
随机推荐
- poj2328---"right on"进入下一个case的模板(while)
#include <stdio.h> #include <stdlib.h> #include<string.h> int main() { ]; ,end=; w ...
- 梯度下降算法的一点认识(Ng第一课)
昨天开始看Ng教授的机器学习课,发现果然是不错的课程,一口气看到第二课. 第一课 没有什么新知识,就是机器学习的概况吧. 第二课 出现了一些听不太懂的概念.其实这堂课主要就讲了一个算法,梯度下降算法. ...
- Android 4.2启动代码分析(一)
Android系统启动过程分析 Android系统的框架架构图如下(来自网上): Linux内核启动之后----->就到Android的Init进程 ----->进而启动Android ...
- poj2186 Popular Cows --- 强连通
给一个有向图,问有多少结点是其它全部结点都能够到达的. 等价于,在一个有向无环图上,找出度为0 的结点.假设出度为0的结点仅仅有一个,那么这个就是答案.假设大于1个.则答案是0. 这题有环.所以先缩点 ...
- 编tuxedo遇到服务问题
各种错误的程序报构建服务: 1. 配置为执行环境变量tmboot –y启动管理流程和服务流程 2. 每日班似这个错误:buildserv:error while loading shared li ...
- 配置tomcat的https通信(单向认证)
1.首先用jdk带的工具生成证书库 打开cmd命令行窗口,cd 到tomcat安装目录的bin下面执行 keytool -v -genkey -alias tomcat -keyalg RSA -ke ...
- android SDK和ADT的更新
ADT版本较低时,造成xml布局文件无法预览,更新时发现google被墙,找网上的招数暂且解决了问题. 1. SDK的更新: 将https://修改为http:// 修改方法是:在Android SD ...
- iOS 证书那些事
关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一个iOS开发小白.半吊 ...
- Problem B: 最少步数
DescriptionA friend of you is doing research on theTraveling Knight Problem (TKP) where you are to f ...
- nyoj 21三个水杯(BFS + 栈)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...