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

 

posted @ 2017-09-09 19:24  toov5  阅读(324)  评论(0编辑  收藏  举报