题目1:给定链表头节点,实现删除链表中间节点的函数。
1->2:删1
1->2->3:删2
…
若链表长度为N,则删除的节点为(N+1)/2。
实现:定位到要删除节点的前一个节点。
方法一:只需要遍历一半。找规律:链表每增加2,要删除的节点就往后移一位
- 对于长度小于等于2的链表,单独考虑。
- 对于长度大于3的链表:
1)初始状态pre=head; cur = head.next.next;
2)以后cur每移动两位,则pre移动一位。
方法二:需要遍历整个链表
- 考虑链表为空或长度为1,则返回头节点。
- 考虑特殊长度为2时,头节点会移动到下一个节点。
- 计算节点个数k,定位要删除的结点的前一个节点,j=k/2
然后执行指针指向操作(即删除节点)
1 | public class RemoveMidNode { |
1 | //方法二:遍历整个链表,找总的节点个数 |
1 | //Test |
注意:查找前一个节点与查找中间节点的不同
1 | //查找中间节点 |
题目2:给定链表头节点,整数a和b,删除位于r=a/b处的节点。
若r=0或r>1不删除任何节点,
若r在区间(0,1/5]上,删除节点1;
若r在区间(1/5,2/5]上,删除节点2;
…
实现:
先计算(double)r = (double(a*n))/ (double)b
r向上取整的整数值代表需要删除的节点是第几个节点。
找到该节点的前一个节点执行删除操作。
1 | public static Node removeByRatio(Node head, int a, int b) { |