删除链表的倒数第N个结点(C++一次遍历)

  1. 题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?
2. 解题思路:
我采用的是双指针的方式,两个指针之间相隔n-1个元素,当后面的那个结点的next域为空的时候,此时p结点指向倒数第n个结点的前一个结点,直接进行删除,要注意的是链表有n个结点而要删除倒数第n个结点的情况(解决方法见代码)。

  1. 代码:
class Solution {
    
    
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
    
    
        //使用相隔n个结点的双指针来进行删除
        ListNode *p = head,*q = head;

        for(int i = 0;i < n ;i++){
    
    
            q = q->next;
        }
        //链表有n个元素,删除倒数第n个元素的情况。
        if(q == nullptr){
    
    
            head = head->next;
            return head;
        }
        while(q->next != nullptr){
    
    
            p = p->next;
            q = q->next;
        }
        p->next = p->next->next;
        return head;
    }
};
  1. tips:无。

猜你喜欢

转载自blog.csdn.net/qq_43964318/article/details/120394922