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

Posted latup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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...),要删除的节点就后移一个位置。

以上是关于2.3 删除链表的中间节点和a/b处的节点的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

[算法]删除链表的中间节点

LeetCode 2095. 删除链表的中间节点

leetcode删除链表的中间节点,快慢指针和链表转数组再转回链表