算法總結之 刪除鏈表的中間節點和a/b處的節點(鏈表中間節點的重要思想)
阿新 • • 發佈:2017-09-09
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處的節點(鏈表中間節點的重要思想)