题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。使用一趟扫描实现。
题目作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetb...
题解作者:WildDuck
题目分析
图片.png

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


struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
    //两个指针构建一个窗口套住固定距离
    ListNode_pointer fast = head;
    ListNode_pointer slow = head;
    
    for(int i=0;i<n;i++)
    {
        fast = fast -> next;
    }
    
    while(fast != NULL && fast->next != NULL)
    {
        fast = fast -> next;
        slow = slow -> next;
    }
    
    if(fast == NULL)//对仅含一个元素的链表特殊处理
    {
        head = head -> next;
        free(slow);
    }    
    else
    {
        ListNode_pointer free_p = slow->next;
        slow -> next = slow->next->next;
        free(free_p);
    }
    
    return head;
}

image.png
窗口套住固定距离


WildDuck
0 声望1 粉丝

引用和评论

0 条评论