リンクリスト: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より大きい場合は、ノードを削除しないでください。
リンクリストの削除の問題は、一般に、1)ヘッドノードの削除、2)非ヘッドノードの削除など、さまざまな状況で説明する必要があります。
package 链表问题;
/**
* 〈一句话功能简述〉<br>
* 〈删除链表的中间节点和a/b处的节点〉
*
* @author 我们
* @create 2021/1/27
* @since 1.0.0
*/
class Node{
public int value;
public Node next;
public Node(int value){
this.value = value;
}
}
public class Solution3 {
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;
}
// (a / b) * n
n = (int) Math.ceil(((double)(a * n)) / (double) b);
// 删除头节点--头节点改变
if (n == 1){
return head.next;
}
// 删除非头节点
if (n > 1){
cur = head; // 重置当前节点
while(--n != 1){ // 找到要删除的前一个节点[所以是--n != 1]
cur = cur.next; // 找到要删除的前一个节点
}
cur.next = cur.next.next; // 删除这个节点
}
return head;
}
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node (5);
removeByRatio(head, 2, 5);
while(head != null){
System.out.println(head.value);
head = head.next;
}
}
}