给定链表的表头节点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;
}}