在单链表和双链表中删除倒数第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 {//找到链表的倒 ...
随机推荐
- iOS6和iOS7代码的适配(2)——status bar
用Xcode5运行一下应用,第一个看到的就是status bar的变化.在iOS6中,status bar是系统在处理,应用中不需要考虑这部分,iOS7之后是应用在处理,每个ViewControlle ...
- Netfilter-packet-flow.svg
调试网络的方法:(Debugging the kernel using Ftrace) $ watch -n1 -d sudo cat /proc/net/snmp$ watch -n1 -d su ...
- dg error
startup force;ORACLE instance started. Total System Global Area 1068937216 bytesFixed Size ...
- collection系列用法-defaultdict()
defaultdict() 定义以及作用 返回一个和dictionary类似的对象,和dict不同主要体现在2个方面: 可以指定key对应的value的类型. 不必为默认值担心,换句话说就是不必担心有 ...
- Tiny Spring 分析一
近期一直想看spring的源代码,可是奈何水平太低,庞杂的源代码令我一阵阵的头晕. 非常有幸,在网上看到了黄亿华大神的<<1000行代码读懂Spring(一)- 实现一个主要的IoC容器& ...
- HTML系列(三):文字设置
一.标题 标题的h1到h6标签,这里不再赘述.值得一提的是,H5中新定义了一个元素<hgroup>,用来将标题和副标题群组.一般在header里将一组标题组合在一起,变成一个区块: < ...
- 简单的CSS网页布局--三列布局
三列布局其实不难,不过要用到position:absolute这个属性,因为这个属性是基于浏览器而言,左右部分各放在左右侧,空出中间一列来实现三列布局. (一)三列布局自适应 <!DOCTYPE ...
- xmanager 使用
linux 上安装xterm windows上启动命令: /usr/bin/xterm -ls -display $DISPLAY
- sql查询当天数据
向数据库中添加日期 MS SQL SERVER: NSERT into student(studentid,time1)values('15',getdate()); MY SQLinsert int ...
- 解决.Net MVC EntityFramework Json 序列化循环引用问题.
以前都是到处看博客,今天小菜也做点贡献,希望能帮到大家. 废话不多说,直接进入正题. 用过.net MVC的同学应该都被json序列化报循环引用错误这个问题骚扰过.网上有一些解决办法,但是都治标不治本 ...