删除链表的倒数第N个节点(Leetcode第19题)

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。
思想:
定义两个指针,一个快指针fast,一个慢指针slow,让快指针先走n步,再让快慢指针一起走,当快指针走到链表最后,慢指针正好走在链表的倒数第n-1个位置,此时删除slow指针的后一个值,即删除了链表第n个位置的值,再考虑一些特殊情况,比如链表只有一个值时,可让slow->next = slow->next->next,删除之后,这时链表为空。
代码实现:

 struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
     int i=0;
    struct ListNode* slow,* fast = head;
    slow = (struct ListNode*)malloc(sizeof(struct ListNode));
    slow->next = head;
    while(i<n)
    {
        fast = fast -> next;
        i++;
    }
    while(fast != NULL)
    {
        fast = fast -> next;
        slow = slow -> next;
    }
    if(slow -> next == head)
        return head -> next;
    else
        slow->next = slow->next ->next;
    return head;
}

猜你喜欢

转载自blog.csdn.net/chenxiyuehh/article/details/86529540