LeetCode19 删除倒数k个节点
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* slow=head; ListNode* fast=head; // if(head->next==NULL){ // if(n==1){ // return NULL; // } // } // if(head->next->next==NULL){ // if(n==1){ // head->next=NULL; // return head; // }else{ // return head->next; // } // } if(head->next==NULL)return NULL; while(n--){ if(fast->next==NULL){ return head->next; } fast=fast->next; } while(fast->next!=NULL){ slow=slow->next; fast=fast->next; } cout<<slow->val<<" "; slow->next=slow->next->next; return head; } };
和找到倒数k个节点很像,但是需要去掉他,所以需要找到他的前驱即倒数k+1个节点。同时还要注意到如何删除的是第一个元素,那么当前节点的前驱是不存在的。还有就是特殊的边界问题。
第一个问题,找到倒数k+1个节点,快慢指针同时向后遍历的时候,判断fast的后继是否为空,则fast位于倒数第一个,而slow位于倒数k+1个。
第二个问题,第一个节点的前驱是不存在的 那么如何删掉第一个节点,可以在快指针移动时判断后继是否为空,若为空,说明需要删除的是第一个节点,那么直接返回第二个节点就可以
当链表只有一个元素时,直接删除返回NULL。
下一篇:
算法修炼32、把数组排成最小的数