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

19.删除链表倒数第k个节点_第1张图片

1,用带哨兵位的头结点。


struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
    if(head==NULL)
    return NULL;
struct ListNode* newnode=(struct ListNode*)malloc(sizeof(struct ListNode));//创建一个带哨兵位的头。
newnode->next=head;
struct ListNode* fast=newnode;
struct ListNode*slow=newnode;
while(n--)
{   if(fast)
    fast=fast->next;      //fast指针先走n步
    else
    return NULL;
}
while(fast->next)
{
fast=fast->next;          //fast和slow一起走       
slow=slow->next;
}
slow->next=slow->next->next;//找到倒数第N个位置的前一个位置,删除第N个位置。
struct ListNode *Newnode=newnode->next;
free(newnode);
return Newnode;
}

2,不带哨兵位。 

19.删除链表倒数第k个节点_第2张图片 

19.删除链表倒数第k个节点_第3张图片 

19.删除链表倒数第k个节点_第4张图片 

 

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){
struct ListNode* fast=head;
struct ListNode*slow=head;
while(n--)
{
    if(fast)
    fast=fast->next;   //fast先走n步
    else
    return NULL;//说明N大于链表的长度。
}     //走到这里,说明N合理,小于等于链表长度。
if(fast==NULL)   //走到这里,说明删除的是头结点,直接返回head->next;
return head->next;
while(fast->next)  //slow和fast一起向后走,直到fast指向最后一个节点。
{
    fast=fast->next;
    slow=slow->next;
}
slow->next=slow->next->next;   //删除倒数第N个节点。
return head;
}

 

 

你可能感兴趣的:(链表,数据结构)