题解 | #删除链表的倒数第n个节点#

删除链表的倒数第n个节点

http://www.nowcoder.com/practice/f95dcdafbde44b22a6d741baf71653f6

前置知识

需要先了解找倒数第k个结点的方法
这里附上“BM8-链表中倒数最后k个结点”的题解:附图解

思路 (以下用k代表n)

  • 找到倒数第k+1个结点:now
  • 将倒数第k+1个结点指向倒数第k-1个结点,即now.next=now.next.next
  • 将倒数第k个结点赋值为null

边界条件讨论

  • 如果k=链表长度,则为删除第一个结点,倒数第k+1个结点为null,则返回倒数第k-1个结点
  • 如果k大于链表长度(不可能出现,题目保证n有效)
  • 如果k=1,则删除最后一个结点,此种边界情况可归并到普通思路中。

符号说明

  • now用于遍历链表(迭代器)
  • last用于记录now的上一个结点
  • box用于记录倒数k+1个结点
public ListNode removeNthFromEnd (ListNode head, int n) {
        if(head==null) return null;
        ListNode now=head;
        ListNode[] box=new ListNode[n+1];
        int i=0;
        //维护box,跳出循环时box[i]为倒数第k+1个结点
        while(now!=null){
            box[i]=now;
            if(i==n) i=0;
            else i++;
            now=now.next;
        }
        //如果k=链表长度,则倒数第k个结点为第一个结点,倒数第k+1个结点不存在,即为null
        if(box[i]==null){
            return head.next;
        }
        //如果k=1,倒数第k+1个结点为box[i],倒数第k个结点为box[0]
        if(i==n){
            box[i].next=box[0].next;
            box[0]=null;
        }
        //k小于链表长度
        else{
            box[i].next=box[i+1].next;
            box[i+1]=null;  
        }
        return head;
    }
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务