力扣刷题:9-删除链表的倒数第 N 个结点(19)

92 阅读1分钟

因为是单链表结构,没有办法逆向遍历,先要从头到尾遍历一遍,计算出整个链表的长度,然后就可以计算出倒数第N个节点,对应正数的方式是第几个节点。最后再找到这个节点删除即可。但是,还有一种思路,就是利用两个节点指针指向头节点,先将其中一个节点指针向后移动N个节点,然后两个节点指针同时向后移动,当其中一个节点指针移动到末尾的时候,另一个节点指针指向的节点就是倒数第N个节点,将它删除即可。

下面是第二种思路实现的C语言代码。

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

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    if (head == NULL) {
        return NULL;
    }
    struct ListNode* p = head;
    struct ListNode* q = head->next;
    while (n--) {
        if (q == NULL) {
            return p->next;
        }
        q = q->next;
    }
    while (q != NULL) {
        p = p->next;
        q = q->next;
    }
    p->next = p->next->next;
    return head;
}