leetcode -- 19 删除链表的倒数第N个节点

题目描述:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

代码实现:(暴力解决)

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode *head, int n) {
        ListNode *dummyNode = new ListNode(0);
        dummyNode->next = head; 
        ListNode* p = head;
        int size = 0;
        while(p != NULL)
        {
            p = p-> next;
            size++;
        } 
        int ans = 0;
        // ListNode* flag ;
        p = dummyNode;
        while(p != NULL)
        {
           
            if(ans + n == size  )
            {
                ListNode* k = p-> next;
                p -> next = k -> next ;
                // p = k; 
                delete(k);
            }
         p = p -> next;
          ans++;
            
        }
    
        return dummyNode -> next ;
        // return head;
    }
};

做题总结:

1:要先引入一个哑结点,这道题中的哑结点就是dummyNode ,是在head之前附加了一个节点,原因是如果要删除head链表中第一个节点若不引入哑结点,还要单独考虑情况,而有了哑结点便统一了操作。

解法二:(双指针)

class Solution{
    public:
        ListNode* removeNthFromEnd(ListNode* head,int n)
        {
            ListNode* dummyHead = new ListNode(0);
            dummyHead -> next = head;
            
            ListNode* p = dummyHead;
            ListNode* q = dummyHead;
            for(int i = 0 ; i < n+1 ; i ++)
            {
                q = q-> next;
            }
            while(q){
                p = p-> next;
                q = q-> next;
            }
            
            ListNode* delNode = p->next;
            p->next = delNode->next;
            delete delNode;
            
            return dummyHead->next;
        }
};

启示:

这种解法是思路上的启发,运用了哑结点和双指针p和q,将q移动到距离p 有n 的节点位置上,然后两指针保持距离一起移动,直到q到NULL位置,而p指向的节点的后一个节点就是要删除的节点。

原文地址:https://www.cnblogs.com/wtzmz/p/13376472.html