算法总结之 删除链表的中间节点和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; } }