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

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

  例如:

  1,不删除任何节点;

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

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

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

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

  进阶:

  给定链表的头节点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,不删除任何节点

My:

1 def del_midnode(L):
2     if L.length > 1:
3         L.delt((L.length+1)//2)

Reference:

 1 def del_midnode(L):
 2     p = L.head
 3     # if linklist is empty or only have one node
 4     if p.next == None or p.next.next == None:
 5         return
 6     # if linklist only have two nodes, then delete the first
 7     if p.next.next.next == None:
 8         p.next = p.next.next
 9         return
10     # if linklist has not less than three nodes
11     pre = p.next
12     cur = pre.next.next
13     while cur.next != None and cur.next.next != None:
14         pre = pre.next
15         cur = cur.next.next
16     pre.next = pre.next.next

思想:如果链表为空或者长度为1, 则不删除任何结点;如果链表长度为2,将头结点删除;如果链表长度不少于3:当长度为3,则删除结点2;当长度为4,则删除结点2;当长度为5,则删除结点3......从以上分析可看出,当链表长度大于3时,链表长度每增加2(3, 5, 7...),要删除的节点就后移一个位置。

原文地址:https://www.cnblogs.com/latup/p/9829471.html

时间: 2024-11-09 00:28:32

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

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

删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1->2->3->4,删除节点2 1->2->3->4->5,删除节点3 如果将本问题复杂一下,给定链表的头节点head.整数a和整数b,实现删除位于a/b处节点的函数. 例如 链表:1->2->3->4->5,假设 a/b 的值为r 如果 r 等于

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

给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1  直接返回 长度2 将头节点删除 长度3 删除第二个  长度4 删除第二个  长度5 删除第三个......长度每增加2 删除的节点就向后移动一个节点 如果要删除一个节点,则需要找到待删除节点的前一个节点 package TT; public class Test87 { public class Node{ public int val

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

[题目]: 给定链表的头节点 head,实现删除链表的中间节点的函数. 例如: 步删除任何节点: 1->2,删除节点1: 1->2->3,删除节点2: 1->2->3->4,删除节点2: 1->2->3->4-5,删除节点3: [进阶]: 给定链表的头节点 head.整数 a 和 b,实现删除位于 a/b 处节点的函数. 例如: 链表:1->2->3->4->5,假设 a/b 的值为 r. 如果 r = 0,不删除任何节点: 如

删除链表的中间节点和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:对于三个

剑指Offer之在O(1)时间删除链表节点

题目描述 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 解题思路 在单向链表中删除一个节点,最常规的做法无疑是从链表的头结点开始,顺序的遍历查找要删除的节点,并在链表中删除该节点.这种思路由于需要顺序查找,时间复杂度自然就是$O(n)$了. 之所以需要从头开始查找,是因为我们需要得到将删除的节点的前面一个节点.在单向链表中,节点中没有指向前一个节点的指针,所以只好从链表的头结点开始顺序查找.那是不是一定需要得到被删除的节点的前一个节点呢?答案是否定的.我们可以很方便

删除链表中倒数第n个节点

1.给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 挑战 O(n)时间复杂度 解题思路:刚开始看到倒数第n个节点,不禁感慨如果是数组就可以直接倒着来了.不过针对链表,一定要想起来最常用的方法---快慢指针.设一个fast和slow指针:快指针先走n步,然后快慢指针一起走,

【链表】在O(1)的时间删除链表的节点

1 /** 2 * 在O(1)的时间删除链表的节点 3 * 4 * @author 5 * 6 */ 7 public class Solution { 8 9 public static void deleteNode(Node head, Node deletedNode) { 10 if (null == head || null == deletedNode) { 11 return; 12 } 13 14 if (deletedNode.next != null) { // 删除的不是

[LeetCode]79. 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 that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 ->

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

题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点.  样例 给出链表1->2->3->4->5->null和 n = 2. 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null. 注意 链表中的节点个数大于等于n 解题: 要删除倒数第n个节点,我们要找到其前面一个节点,也就是倒数第n+1的节点,找到这个节点就可以进行删除.和上题的思想很类似, 定义两个指针,p和cur,cur指针向前走,走了n