要删除一个链表的第k个结点,需要考虑以下几点:
- 判断链表是否为空
- 删除第一个结点,及k==1时,不能使用x.next = x.next.next的方法来删除,因为第一个结点没有前序结点
- k大于结点数时不做操作
void delete(int k) {
int N =1;
Node current = first;
if(current==null) {return;} //若目标链表为null,则停止操作
else if(k==1) {first = first.next;} //如果删除的是第一个结点
else {
Node next = current.next;
while(next!=null) {
//若要删除第k个值,那么当current为k-1时
// current.next = current.next.next即可删除第k个元素
if(N==k-1)
{current.next = current.next.next;}
current = next;
next = current.next;
N++; //N值就代表当前current是第几个值。
}
return;
}
}
同理,当要删除倒数第n个值时,先遍历链表,得到链表结点个数
private int N = 0;
for(Node x = first;x!=null;x=x.next){
N++;
}
//倒数第n个结点即为正数第N-n+1个结点,记为num;
int num = N-n+1;
Node current = first;
Node next = current.next;
if(num==1) {first = first.next;}
else {
int i =1;
while(next!=null) {
if(i==num-1) {current.next = current.next.next;}
current = next;
next = next.next;
i++;
}
return;
}