第一题:删除第n个节点
思路:如果要删除第n个节点,只需要第n-1个节点next指针指向n+1节点即可。
/**
* 删除第n个节点
* @param n
*/
public void deleteNode(int n){
if(n>size||n<0){
throw new IndexOutOfBoundsException();
}
Node faster=head;//指针
while(faster!=null){
if(--n==1){//被删除节点之前的一个节点
faster.next=faster.next.next;//让指针的next指向next的next
break;
}
faster=faster.next;
}
}
第二题:删除倒数第n个链表节点
既然只允许遍历一次,且N一直有效,那么可以利用双指针解法(前指针、后指针),让前指针先走N步,再让两个在指针同时后移,直到前指针到达尾部,此时,后指针的下一个节点就是要被删除的节点了。
/**
* 删除倒数n个节点
* @param n
*/
public void deleteReciprocalNode(int n){
Node faster=head;//快指针
Node slower=head;//慢指针
while(faster!=null){
faster=faster.next;
n--;
if(n<0&&faster!=null){//开始移动慢指针
slower=slower.next;
}
}
slower.next=slower.next.next;//让慢指针的next指向next的next
}