问题描述

  分别实现两个函数,一个可以删除单链表中倒数第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个节点的更多相关文章

  1. 在单链表和双链表中删除倒数第K个节点

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...

  2. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  3. 算法总结之 在单链表和双链表中删除倒数第k个节点

    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...

  4. 链表问题----删除倒数第K个节点

    在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...

  5. 在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  6. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  7. 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节

    [题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...

  8. 1.求链表中的倒数第K个节点

    注意事项:1.要是K大于链表长度怎么办? 2.k<=0怎么办? ListNode* FindR_Kth(ListNode* p_head, unsigned int k) 2 {//找到链表的倒 ...

  9. 《剑指offer》面试题15 链表中的倒数第k个节点 Java版

    书中方法:用两个节点一次遍历求得倒数第k个节点.注意头节点为空,k<=0,k大于节点个数的情况. public ListNode find(ListNode head, int k){ if(h ...

随机推荐

  1. 洛谷 P3805 【模板】manacher算法

    洛谷 P3805 [模板]manacher算法 洛谷传送门 题目描述 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 字符串长度为n 输入格式 一行小写英文字符 ...

  2. idea实战技巧

    一.背景 为什么想写这个,因为编码一线更多的是实战,实战中,可能一个快捷键,一个小技巧,就能省很多时间. 本文会持续记录,持续更新. 二.技巧 1.全局替换(带正则) 场景是: 多profile的情况 ...

  3. 深蓝词库转换2.6版发布——支持Emoji、颜文字和小鹤双拼

    端午期间,别人在度假,我在家码代码,把深蓝词库转换做了一下版本升级.本次更新主要是2大特性: 1.支持Emoji和颜文字 在源词库中可以选择Emoji. Emoji文件的格式为: Emoji+< ...

  4. Thinkphp <= 5.0.10 缓存getshell复现

    目录 Thinkphp <= 5.0.10 缓存getshell复现 0x01 poc 0x02 跟踪源码 0x03 审计思路 0x04 补丁 0x05 参考 Thinkphp <= 5. ...

  5. PHP+Mysql统计文件下载次数实例

    PHP+Mysql统计文件下载次数实例,实现的原理也很简单,是通过前台点击链接download.php传参id,来更新点击次数. 获取文件列表: <?php require 'conn.php' ...

  6. SSH框架之Hibernate第四篇

    Hibernate中有两套实现数据库数据操作的方式 : hibernate前3天讲解的都是 : hibernate自己的操作方式(纯XML配置文件的方式) 另一种方式是基于JPA的操作方式(通过注解的 ...

  7. PHP http_response_code 网络函数

    定义和用法 http_response_code - 获取/设置响应的 HTTP 状态码 版本支持 PHP4 PHP5 PHP7 不支持 支持  支持 语法 http_response_code ([ ...

  8. Spring高级注解

    目录: 1.使用限定注解:2.自定义限定注解:3.自定义bean的生命周期: 开发环境:IntelliJ IDEA 2019.2.2Spring Boot版本:2.1.8新建一个名称为demo的Spr ...

  9. SQL Server关于AlwaysOn的理解

    (一)SQL Server-AlwaysOn 技术:SQL Server AlwaysOn 即“全面的高可用性和灾难恢复解决方案” 1.数据库级可用性-只读副本:SQL Server 2012-4个, ...

  10. [转]java 通过反射获取类的全局变量、方法、构造方法

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.str;   public class ZiFuChuan {       ...