19

19.删除链表的倒数第N个节点

使用双指针 p ,q

我们要删除倒数第n个节点。

由于我们先前不知道链表的长度 ,因此我们需要转换一下思维,假设链表长度为m

我们用一个指针当作长度m, 先让指针q移动n个节点,此时只要让p移动m - n个节点就可以进行free

那么q指针剩下的路不就是,m - n吗?,因此代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    struct ListNode ret, *p, *q;
    ret.next = head;
    p = q = &ret;
    while (n--) { q = q->next; }
    q = q->next;
    while (q) {
        p = p->next;
        q = q->next;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return ret.next;
}

猜你喜欢

转载自blog.csdn.net/code527/article/details/90080922
19