问题描述:

删除链表的中间节点和a/b处的节点

给定链表的头结点head,实现删除链表的中间节点的函数:

例如:

不删除任何节点;

1-->2,删除节点1;

1-->2-->3,删除节点2

1-->2-->3-->4,删除节点2;

1-->2-->3-->4-->5,删除节点3;

分析及解题思路:

  对于删除链表中的中间节点而言,当节点数增加2时,要删除的中间节点向后移一位。比如,首先链表中没有节点或节点为1个时,直接返回头结点;当节点数为2个时,直接返回head.next;对于三个节点以上的情况,有如下解决过程:

  对于删除链表中的某个节点,要知道该节点的前一个节点的位置,只需将前一个节点的位置的next区域指向要删除节点的下一个位置即可。

  当链表节点的个数为3个时,则删除第二个节点,当节点数增加2时,此时要删除的节点就向后移一位。比如,当节点数为4个时,也是删除第二个节点;当节点数为5时,此时要删除第三个节点。所以首先pre指向头节点(pre每次指向要删除节点的前一个节点),cur指向pre节点的下一个节点的下个节点,然后判断当cur的下一个节点存在以及下下个节点存在时,说明在最初节点数为3个的基础上链表节点的个数增加2个,则pre指向后一个节点,cur指向下一个节点的下一个节点;直到cur的下一个节点或者下下个节点不存在时,循环结束,此时pre指向的位置正好是要删除链表中间节点的前一个节点的位置。这时删除节点即可。

代码实现:

 class Node(object):
def __init__(self, data):
self.data = data
self.next = None def createSingleLink(num):
head = Node(1)
cur = head
for i in range(2, num+1):
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 removeMidNode(head):
if head is None or head.next is None:
return head
if head.next.next is None:
return head.next
pre = head
cur = head.next.next
while cur.next and cur.next.next:
pre = pre.next
cur = cur.next.next
pre.next = pre.next.next
return head if __name__ == '__main__':
singleLinkHead = createSingleLink(9)
printSingleLink(singleLinkHead)
newSingleLinkHead = removeMidNode(singleLinkHead)
print()
printSingleLink(newSingleLinkHead)

进阶:

  给定链表的头结点head、整数a和b,实现删除位于a/b处节点的函数。

例如:

链表:1-->2-->3-->4-->5,假设a/b的值为r。

  • 如果r等于0,不删除任何节点;
  • 如果r在区间(0, 1/5]上,删除节点1;
  • 如果r在区间(1/5, 2/5]上,删除节点2;
  • 如果r在区间(2/5 3/5]上,删除节点3;
  • 如果r在区间(3/5, 4/5]上,删除节点4;
  • 如果r在区间(4/5, 1]上,删除节点5;
  • 如果r大于1,不删除任何节点。

分析及解题思路:

  首先,当给出a和b的值后,要确定删除的是哪个节点,通过下面的式子的结果r来确定要删除的哪个节点,其中n为链表节点的个数:

r = (a * n) / b

最终的r向上取整,例如:

N = 5,a = 3,b = 5

则r = 3,即删除第三个节点;

N = 5,a = 3,b = 4

则r = 3.75,向上取整后删除的节点为第4个节点;

N = 5,a = 2,b = 6

则r = 1.6667,向上取整后删除的节点为第2个节点;

代码实现:

 import math
class Node(object):
def __init__(self, data):
self.data = data
self.next = None def createSingleLink(num):
head = Node(1)
cur = head
for i in range(2, num+1):
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 removeByRatio(head, a, b):
if a < 1 or a > b:
return head
cur = head
n = 0
while cur:
n += 1
cur = cur.next
r = math.ceil((a * n) / b)
if r == 1:
head = head.next
if r > 1:
pre = head
while r > 2:
r -= 1
pre = pre.next
pre.next = pre.next.next
return head if __name__ == '__main__':
singleLinkHead = createSingleLink(5)
printSingleLink(singleLinkHead)
newSingleLinkHead = removeByRatio(singleLinkHead, 5, 5)
print()
printSingleLink(newSingleLinkHead)

删除链表的中间节点和a/b处的节点的更多相关文章

  1. 链表问题----删除链表的中间节点和a/b处的节点

    删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1-& ...

  2. 删除链表中间节点和a/b处的节点

    [题目]: 给定链表的头节点 head,实现删除链表的中间节点的函数. 例如: 步删除任何节点: 1->2,删除节点1: 1->2->3,删除节点2: 1->2->3-& ...

  3. 算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)

    给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1  直接返回 长度2 将头节点删除 长度3 ...

  4. 左神算法书籍《程序员代码面试指南》——2_03删除链表的中间节点和a/b处的节点

    [题目]给定链表的头节点head,实现删除链表的中间节点的函数.例如:不删除任何节点:1->2,删除节点1:1->2->3,删除节点2:1->2->3->4,删除节 ...

  5. 删除链表的中间节点和a/b处节点

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

  6. [LeetCode] Delete Node in a Linked List 删除链表的节点

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  7. [CareerCup] 2.3 Delete Node in a Linked List 删除链表的节点

    2.3 Implement an algorithm to delete a node in the middle of a singly linked list, given only access ...

  8. lintcode:在O(1)时间复杂度删除链表节点

    题目: 在O(1)时间复杂度删除链表节点 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2 ...

  9. lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点

    题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...

随机推荐

  1. CSV和JSON格式相互转换

    1.为什么要进行CSV与JSON格式之间的转换 CSV格式常用于一二维数据表示和存储,他是一种纯文本形式存储表格数据的表示方式.JSON也可以表示一二维数据.在网络信息传输中,可能需要统一表示方式,因 ...

  2. 你可能会忽略的 Git 提交规范

    一.为什么需要规范? 无规矩不成方圆,编程也一样. 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你.可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目 ...

  3. PalletOne调色板Token PTN跨链转网的技术原理

    之前一直在忙于通用跨链公链PalletOne的研发,没有怎么做技术分享的博客,最近PalletOne主网上线也有几个月的时间了,即将进行PTN(PalletOne上面的主Token)从ERC20到主网 ...

  4. NIO零拷贝的深入分析

    深入分析通过Socket进行数据文件传递中的传统IO的弊端以及NIO的零拷贝实现原理,及用户空间和内核空间的切换方式 传统的IO流程 在这个过程中: 数据从磁盘拷贝进内核空间缓冲区 从内核空间缓冲区拷 ...

  5. Java入门——在Linux环境下安装JDK并配置环境变量

    Java入门——在Linux环境下安装JDK并配置环境变量 摘要:本文主要说明在Linux环境下JDK的安装,以及安装完成之后环境变量的配置. 使用已下载的压缩包进行安装 下载并解压 在Java的官网 ...

  6. 【JS简洁之道小技巧】第一期 扁平化数组

    介绍两种方法,一是ES6的flat,简单粗暴.二是递归,也不麻烦. flat ES6自带了flat方法,用于使一个嵌套的数组扁平化,默认展开一个嵌套层.flat方法接收一个数字类型参数,参数值即嵌套层 ...

  7. git命令教程

    git教程笔记 Git是什么? Git是一个分布式版本控制系统 版本控制方式 集中式版本控制:从版本库中先取得最新的版本,改完之后再上传到版本库中,需要联网 分布式版本控制:每个合作者电脑上都有一个版 ...

  8. 解决html导出pdf中文乱码问题的正确姿势

    简介 本文使用jspdf 1.5.3版.GitHub地址:https://github.com/MrRio/jsPDF jspdf是歪果仁开发的,因此在一开始就没想过支持非英文以外的文字,这就导致了非 ...

  9. SDWebImage4.0之后加载gif不显示的解决方案

    SDWebImage4.0之前 UIImageView *imgView = [UIImageView new]; imgView.contentMode = UIViewContentModeSca ...

  10. Android 图表控件的使用

    一个简单不复杂的图表控件ChartLibs,目前仅仅提供三种图表控件:饼图.条形图和线性图.其展示效果 如下: 使用方法很简单,直接通过gradle导入ChartLibs依赖就可以,在build.gr ...