链表中删除倒数第K个节点
问题描述
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
问题分析与解决
从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如果链表为空或者K<0时,直接返回;如若不然,遍历链表的每个节点,每经过一个节点K减1。比如对于1 --> 2 --> 3 --> 4该链表的过程如下:
K = 5,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 4,3,2,1;
K = 4,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 3,2,1,0;
K = 3,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 2,1,0,-1;
K = 2,所遍历的节点以及K值的变化:1 -- > 2 --> 3 --> 4 1,0,-1,-2;
由上可知,遍历链表中的节点,每经过一个节点K值减1的过程中,当K > 1时,说明链表中要删除的倒数第K个节点不存在,此时已经超出链表的长度;当K = 0时,此时正好要删除的是链表中的第一个节点,这是只需头节点指向头节点的下一个节点即可;那么对于K < 0时,该如何删除链表中倒数第K的节点呢?
经过上面的步骤后,如果K<0,此时重新遍历链表,只不过这时是每经过一个节点K值增1。如下示例(K值保存经过减1后的结果):
K = -1,所遍历的节点以及K值的变化:1 0;
K = -2,所遍历的节点以及K值的变化:1 -- > 2 -1,0;
在遍历链表K值增1的过程中,当K = 0时,所在的位置正好是要删除倒数第K个节点的前一个节点,此时只需将前一个节点指向要删除的节点的下一节点即可。
代码实现(单链表):
class Node(object):
def __init__(self, data):
self.data = data
self.next = None def createSingleLink():
head = Node(1)
cur = head
for i in range(2, 10):
cur.next = Node(i)
cur = cur.next
return head def printSingleLink(head):
cur = head
while cur:
print(cur.data, end='')
if cur.next:
print('-->', end='')
cur = cur.next def removeLastKthNode(head, lastKth):
if head is None or lastKth < 0:
return head
cur = head
# lastKth -= 1
while cur:
lastKth -= 1
cur = cur.next
# print(lastKth)
if lastKth == 0:
head = head.next
if lastKth < 0:
cur = head
lastKth += 1
while lastKth < 0:
cur = cur.next
lastKth += 1
cur.next = cur.next.next
return head if __name__ == '__main__':
singleHead = createSingleLink()
printSingleLink(singleHead)
print()
newSingleHead = removeLastKthNode(singleHead, 6)
printSingleLink(newSingleHead)
上述代码是对删除单链表倒数第K个节点的实现,那么对于双链表的实现过程和单链表的过程相同,只不过在删除某一节时要注意节点的前驱指针的指向。
代码实现(双链表):
class Node(object):
def __init__(self, data):
self.last = None
self.data = data
self.next = None def createDoubleLink():
head = Node(1)
cur = head
for i in range(2, 10):
cur.next = Node(i)
cur = cur.next
return head def printLink(head):
cur = head
while cur:
print(cur.data, end='')
if cur.next:
print('-->', end='')
cur = cur.next def removeLastKthNode(head, lastKth):
if head is None or lastKth < 0:
return head
cur = head
while cur:
lastKth -= 1
cur = cur.next
if lastKth == 0:
head = head.next
head.last = None
if lastKth < 0:
cur = head
lastKth += 1
while lastKth < 0:
cur = cur.next
lastKth += 1
if cur.next.next:
cur.next = cur.next.next
cur.next.last = cur
else:
cur.next = None
return head if __name__ == '__main__':
doubleLinkHead = createDoubleLink()
printLink(doubleLinkHead)
print()
newDoubleLinkHead = removeLastKthNode(doubleLinkHead, 6)
printLink(newDoubleLinkHead)
链表中删除倒数第K个节点的更多相关文章
- 在单链表和双链表中删除倒数第K个节点
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 算法总结之 在单链表和双链表中删除倒数第k个节点
分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...
- 链表问题----删除倒数第K个节点
在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...
- 在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- [算法]在单链表和双链表中删除倒数第k个结点
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
- 1.求链表中的倒数第K个节点
注意事项:1.要是K大于链表长度怎么办? 2.k<=0怎么办? ListNode* FindR_Kth(ListNode* p_head, unsigned int k) 2 {//找到链表的倒 ...
- 《剑指offer》面试题15 链表中的倒数第k个节点 Java版
书中方法:用两个节点一次遍历求得倒数第k个节点.注意头节点为空,k<=0,k大于节点个数的情况. public ListNode find(ListNode head, int k){ if(h ...
随机推荐
- 花了三个月终于把所有的 Python 库全部整理了!可以说很全面了
库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...
- Redis开发与运维:特性
Redis 特性 速度快 内存数据库 L1 cache reference 读取CPU的一级缓存 0.5 ns Branch mispredict (转移.分支预测) 5 ns L2 cache re ...
- 用 Python 破解 WiFi 密码
如今,WiFi 跟我们的生活息息相关,无处不在.没有 WiFi 的地方是没有灵魂的! 然而,比没有WiFi更让人绝望的,是有满格WiFi信号却没有密码…… 今天我们就来尝试下,如何利用pyth ...
- 学习强国docker文件用法
学习强国docker用法 docker文件地址 https://github.com/fuck-xuexiqiangguo/docker 构建 docker docker build -t D ...
- [爬虫]一个易用的IP代理池
一个易用的IP代理池 - stand 写爬虫时常常会遇到各种反爬虫手段, 封 IP 就是比较常见的反爬策略 遇到这种情况就需要用到代理 IP, 好用的代理通常需要花钱买, 而免费的代理经常容易失效, ...
- RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理
1.引言 文件中心类似附件管理是一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧"附件分类"展示了用户对文件 ...
- 19-Docker 镜像小结
本节我们对 Docker 镜像做个小结. 这一部分我们首先讨论了镜像的分层结构,然后学习了如何构建镜像,最后实践使用 Docker Hub 和本地 registry. 下面是镜像的常用操作子命令: i ...
- linux环境下卸载oracle 11g
1.停库[oracle@testdb ~]$ sqlplus / as sysdbaSQL> shutdown immediateDatabase closed.Database dismoun ...
- fstab是什么?被谁用?怎么写?
关键词:fstab.mount -a.fsck等等. 1. fstab是干什么的? fstab是file system table的意思,即文件系统表. 它在开机的时候告诉系统挂载哪些分区.挂载点是什 ...
- NXP_RTCESL库
恩智浦实时控制嵌入式软件库(缩写为RTCESL,以前为恩智浦嵌入式软件库FSLESL)是一组算法,从基础数学运算到高级数学变换以及高级观测器,这些都可以方便地用在复杂的实时控制应用中以及我们的电机控制 ...