关键点:
代码:
- 删除一个节点,首先找到待删除节点的前一个节点 注意此题利用快慢指针找到中间节点的方法
- 删除a/b处节点,即 int k = (int)Math.ceil((double) (a*size)/((double)b));//向上取整 删除第k个节点
public static Node removeMidNode(Node head) {
if(head == null || head.next == null) return head;
if(head.next.next == null) return head.next;
Node fast = head;
Node slow = head;
Node pre = null;//记录中间节点的前一个节点
while(fast.next != null && fast.next.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
// mid = slow;//中间节点 慢指针最终到达中间节点位置
// last = fast;//终结点 快指针最终到达终结点位置
pre.next = slow.next;
return head;
}
public static Node removeRatioNode(Node head,int a,int b) {
if(head == null || a/b > 1 || a < 1) return null;
Node cur = head;
int size = 0;//链表长度
while(cur != null) {
size++;
cur = cur.next;
}
int k = (int)Math.ceil((double) (a*size)/((double)b));//向上取整 删除第k个节点
//删除头结点的处理
if(k == 1) return head.next;
//找待删除节点的前一个节点
cur = head;
while(--k != 1) {
cur = cur.next;
}
cur.next = cur.next.next;
return head;
}