【双指针】删除链表的倒数第N个节点

之前用遍历两次链表的本方法,这次借鉴网上的经典双指针方法。算法主体思想是:用两个指针一个快指针,一个慢指针,快指针先在前面跑步一段(为了让快慢指针间隔n步),然后快慢指针一起跑,直到快指针指向null结束。但是如果是这样的话,slow指针指向的是要删除的指针(删除某一个节点要指向它之前的节点)所以得让fast指针多走一步。代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
       
        ListNode*VirHead= new ListNode(0);//定义虚拟头结点,便于删除
        VirHead->next=head;
        ListNode*fast=VirHead;//定义快指针
        ListNode*slow=VirHead;//定义慢指针
        while(n--&&fast!=nullptr){//快指针先走N步
            fast=fast->next;
        }
        fast=fast->next;//快指针再走一步是为了让后来的慢指针指向删除节点的前一个节点
        while(fast!=nullptr){
            fast=fast->next;
            slow=slow->next;
        }
        ListNode*tmp=slow->next;//删除操作
        slow->next=slow->next->next;
        delete tmp;
        head=VirHead->next;
        return head;

    }
   
};

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