算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)
给定链表的表头节点head,实现删除链表的中间节点的函数
推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数
先来分析原问题,
长度1 直接返回
长度2 将头节点删除
长度3 删除第二个 长度4 删除第二个 长度5 删除第三个。。。。。。长度每增加2 删除的节点就向后移动一个节点
如果要删除一个节点,则需要找到待删除节点的前一个节点
package TT;
public class Test87 {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value = data;
}
}
public static Node removeMidNode(Node head){
if(head==null || head.next == null){
return head;
}
if(head.next.next == null){
return head.next;
}
Node pre = head;
Node cur = head.next.next;
while(cur.next !=null & cur.next.next != null){
pre=pre.next;
cur=cur.next.next;
}
pre.next = pre.next.next;
return head;
}
}
公式的套用计算 double r = ((double)(a*n))/((double)b) n代表链表长度 向上取整就ok 然后计算删除第几个节点 找到需要删除节点的前一个节点即可
package TT; import TT.Test85.Node; public class Test87 { public Node removeByratio(Node head, int a, int b){ if(a<1 |a >b){ return head; //不删除任何节点 } int n = 0; Node cur = head; while(cur !=null ){ n++; //计数 cur = cur.next; } n = (int) Math.ceil(((double)(a*n))/(double)b); if(n==1){ head = head.next; } if(n>1){ cur = head; while(--n != 1){ cur = cur.next; } cur.next = cur.next.next; } return head; } }