19. Remove Nth Node From End of List

Given a linked list, remove the nth node from the end of list and return its head.

For example,

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list
becomes 1->2->3->5.
Note: Given n will always be valid. Try to do this in one pass.

分析:
这题算是双指针的一个常见做法,加上链表里面常见的细节处理。链表删除在于定位要删的节点,而且必须将指针放在删除节点前一个位置(单向链表而言)。所以我们可以用两个指针,固定间隔n,向尾部移动,当后指针到达底部,前指针的下一个就是需要操作的位置。代码如下:

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode *temphead = new ListNode(0);
    temphead->next = head;
    ListNode *p = temphead, *q = temphead;
    int count = 0;
    while (count < n && q->next != NULL) {
        q = q->next;
        count++;
    }
    while (q->next != NULL) {
        q = q->next;
        p = p->next;
    }
    p->next = p->next->next;
    head = temphead->next;
    return head;
}

注意的就是,如果删除的是第一个节点呢?所以我们通常加一个dummy node作为头结点,这里就是我的temphead,这点在链表处理里很常见。还有就是返回的时候不要返回head,head作为指针始终指向那个内存空间,如果你删除了head在temphead后的关系,也并不改变head索引整个链表的关系,如果你释放那块内存,返回的head就是个空指针,所以这里我把head指向了temphead的下一个,这才是修改后新链表的第一个节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值