題目: 刪除鏈表倒數第 n 個結點 * 例子:刪除倒數第4個節點 1->3->5->8->9->10->12->11->17 * 結果爲:1->3->5->8->9->12->11->17
* 思路:先讓指向頭結點的指針 tmp 先向下走 n 個節點,接着頭結點 head 與tmp同時走,指導tmp節點到達尾結點, * 此時頭結點head的下一個指針就是要刪除的節點,將其從鏈表中移除
public class LinkedList {
public void print(LinkedNode<Integer> root){
LinkedNode<Integer> tmp = root;
while (tmp.next!=null){
System.out.print(tmp.value+"->");
tmp = tmp.next;
}
System.out.print(tmp.value);
System.out.println();
}
//創建鏈表
public LinkedNode<Integer> constructLinkedList(LinkedNode<Integer>... nodes){
LinkedNode<Integer> root = new LinkedNode<>(0);
LinkedNode<Integer> tmp = root;
for(LinkedNode<Integer> node:nodes){
tmp.next = node;
tmp = tmp.next;
}
return root.next;
}
/**
* 4、題目: 刪除鏈表倒數第 n 個結點
* 例子:刪除倒數第4個節點 1->3->5->8->9->10->12->11->17
* 結果爲:1->3->5->8->9->12->11->17
* 思路:先讓指向頭結點的指針 tmp 先向下走 n 個節點,接着頭結點 head 與tmp同時走,指導tmp節點到達尾結點,
* 此時頭結點head的下一個指針就是要刪除的節點,將其從鏈表中移除
*/
@Test
public void test4(){
LinkedNode<Integer> node11 = new LinkedNode<>(1);
LinkedNode<Integer> node12 = new LinkedNode<>(3);
LinkedNode<Integer> node13 = new LinkedNode<>(5);
LinkedNode<Integer> node14 = new LinkedNode<>(8);
LinkedNode<Integer> node15 = new LinkedNode<>(9);
LinkedNode<Integer> node16 = new LinkedNode<>(10);
LinkedNode<Integer> node17 = new LinkedNode<>(12);
LinkedNode<Integer> node18 = new LinkedNode<>(11);
LinkedNode<Integer> node19 = new LinkedNode<>(17);
LinkedNode<Integer> root = constructLinkedList(node11,node12,node13,node14,node15,node16,node17,node18,node19);
print(root);
int n = 4;
LinkedNode<Integer> tmp1 = root;
LinkedNode<Integer> tmp2 = root;
while (n>0){
tmp2 = tmp2.next;
n--;
}
while (tmp2.next !=null){
tmp2 = tmp2.next;
tmp1 = tmp1.next;
}
tmp1.next = tmp1.next.next;
print(root);
}
}
輸出結果:
1->3->5->8->9->10->12->11->17
1->3->5->8->9->12->11->17