要求:
给定链表的头节点head,实现删除链表的中间节点的函数。例如:
链表: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,不删除任何节点。
实现代码:
Node.java
package algorithm_10;
public class Node {
public int value;
public Node next;
public Node (int data){
this.value = data;
}
}
algorithm_10.java
package algorithm_10;
public class algorithm_10 {
public 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;
}
public static 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;
}
public static Node init(Node head){
for (int i = 2; i < 20; i++){
head.next = new Node(i);
head = head.next;
}
return head;
}
public static void print(Node head){
Node cur = head;
while (cur != null) {
System.out.print(cur.value + " ");
cur = cur.next;
}
System.out.print(" \n");
}
public static void main(String[] args){
Node test = new Node(1);
init(test);
System.out.println("Before removeing:");
print(test);
removeByRatio(test, 3, 7);
System.out.println("After removeing:");
print(test);
}
}
实现结果:
Before removeing:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
After removeing:
1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 18 19
分析:
链表test为1-20的值,选取3/7作为删除点,即20*3/7≈8.5,即需要删除第九个。