链表专题之Remove Nth Node From End of List leetcode(19)

  Given linked list: 1->2->3->4->5, and n = 2.

   After removing the second node from the end, the linked list becomes 1->2->3->5
给定一个链表,要求去除倒数第n个节点,然后返回新的链表

思路:要去除节点,首先要找到待删除节点的前一个节点。由于是倒数,考虑从后往前挪是行不通的,因此需要换位思考,从前往后移动n-k个节点是个办法,但是n不知道,需要遍历一次才知道n。从前往后挪动n-k的时候,考虑构造两个指针,一个先挪到k的位置,然后另一个指针从头开始,两个指针同时挪动直到先挪的指针到链表末尾。要记录倒数第k个节点的头一个节点,以便删除。删除记得释放内存,并注意边界条件。

ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (head == NULL)
            return NULL;
        
        ListNode* p = head;//指针p先走n步
        
        while (n--)
        {
            p = p->next;
        }
        if(p == NULL)   //p走到了null

        {

             ListNode* tmp = head->next;

             free(head);    //释放内存,对于在线编程而言,是delete还是free值得思考

             return tmp;  
        }
        
        ListNode *q = head;
        ListNode *tmp = head;
        
        while(p != NULL)
        {
            tmp = q;//记录倒数第k+1个节点
            q = q->next;
            p = p->next;
        }
       
        tmp->next = q->next;    //删除节点,改变指针的指向
        free(q);    //q为待删除节点,记得释放内存
        return head;
        
    }

猜你喜欢

转载自blog.csdn.net/u012260341/article/details/79531631
今日推荐