1. 程式人生 > >算法總結之 刪除鏈表的中間節點和a/b處的節點(鏈表中間節點的重要思想)

算法總結之 刪除鏈表的中間節點和a/b處的節點(鏈表中間節點的重要思想)

math 取整 算法 blog 總結 rem nod == while

給定鏈表的表頭節點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; } }

算法總結之 刪除鏈表的中間節點和a/b處的節點(鏈表中間節點的重要思想)