链表中删除倒数第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 ...
随机推荐
- java之父类中的构造器是否能被子类继承?
子类默认继承父类的属性和方法,但不会继承父类的构造器,而是在子类被实例化时会默认调用父类的空构造器.子类在创建的时候会调用自己的空构造器,并在空构造器会隐式调用super(),即父类的空构造器.如果父 ...
- PAT 1006 Sign In and Sign Out 查找元素
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- SpringCloud的入门学习之概念理解、Feign负载均衡入门
1.Feign是SpringCloud的一个负载均衡组件. Feign是一个声明式WebService客户端.使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口, ...
- (转)isolation forest进行异常点检测
原文链接:https://www.cnblogs.com/gczr/p/9156971.html 一.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似, ...
- 订单结算submit_order.php扣库存,扣账号金额(学生笔记)
<?php header("Content-type: text/html; charset=utf-8"); session_start(); include_once(& ...
- 软件设计之基于Java的连连看小游戏(一)——开题及游戏首页的制作
原本计划紧张忙碌的考试月在图书馆和实验室度过,结果突如其来为期两周的软件设计把课余时间几乎捆绑在了机房.软设没有太多知识上的要求,只要成品简洁美观.实用准确即可.考虑了很久决定要用Java swing ...
- SSH框架之Struts2第一篇
1.2 Struts2的概述 : Struts2是一个基于MVC设计模式的WEB层的框架. 1.2.1 常见web层框架 Struts1,Struts2,WebWork,SpringMVC Strut ...
- OpenCV绘制直线,矩形和园
首先导入我们所需要的库: import numpy as np import cv2 import matplotlib.pyplot as plt 自定义显示图像的函数: def show(imag ...
- Pandas:DataFrame数据选择方法(索引)
#首先创建我们的Series对象,然后合并到dataframe对象里面去 import pandas as pd import numpy as np area=pd.Series({,,,}) po ...
- 微信小程序支付功能 C# .NET开发
微信小程序支付功能的开发的时候坑比较多,不过对于钱的事谨慎也是好事.网上关于小程序支付的实例很多,但是大多多少有些问题,C#开发的更少.此篇文档的目的是讲开发过程中遇到的问题做一个备注,也方便其他开发 ...