自学内容网 自学内容网

力扣 K个一组翻转链表

K个一组翻转链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        //创建一个虚头节点Head,并将下一个节点指向head,方便后面的操作
        ListNode* Head = new ListNode();
        Head->next=head;
        //定义一个指针MoveHead指向Head,始终在每个将要反转的子链表的前一个位置,方便反转后进行连接
        ListNode* MoveHead = Head;
        //定义一个指针ChildTail也指向Head,用于循环找到每个将要反转的子链表的尾部位置
        ListNode* ChildTail = Head;
        //ChildTail为NULL时结束循环,说明已经全部遍历反转完成
        while(ChildTail)
        {
            //循环找到将要反转的子链表的尾部位置
            for(int i=0;i<k;i++)
            {
                ChildTail=ChildTail->next;
                //如果将要反转的子链表长度小于k,则后续节点就不需要反转了,返回反转后的链表
                if(ChildTail == NULL)return Head->next;
            }
            /*定义指针NewChildHead指向当前子链表的下一个节点,即为确定下一个子链表的头节点位置,
            方便当前子链表反转之后与后续链表进行连接
            */
            ListNode* NewChildHead = ChildTail->next;
            //反转链表
            ListNode* cur = NULL;
            ListNode* pre = head;
            while(pre!=NewChildHead)
            {
                ListNode* t = pre->next;
                pre->next = cur;
                cur = pre;
                pre = t;
            }
            //将反转后的子链表拼接回原来的链表中
            MoveHead->next = cur;
            head->next = NewChildHead;

            //以下操作都是相当于还原到反转第一个子链表之前对应的位置,用于下一个子链表的反转
            //将ChildTail指向反转后尾部节点的位置
            ChildTail = head;
            //将MoveHead指向下一个将要反转的子链表的前一个位置
            MoveHead = head;
            //头节点指向下一个将要反转的子链表的头节点
            head = NewChildHead;
        }
        return Head->next;
    }
};

每日问题

什么是纯虚函数?什么是抽象类?纯虚函数和抽象类在面向对象编程中的意义是什么?

纯虚函数

1.定义:

        纯虚函数(pure virtual function)是指被标明为不具体实现的虚拟成员函数。它用于定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类。定义纯虚函数的一般格式为:“virtual 返回类型 函数名(参数表)=0;”。

2.特点:

        纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类。

        定义纯虚函数时,不能定义虚函数的实现部分。即使是函数体为空也不可以,因为函数体为空就可以执行,只是什么也不做就返回,而纯虚函数不能调用。

        “=0”表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0”本质上是将指向函数体的指针定为NULL。

        在派生类中必须有重新定义的纯虚函数的函数体,这样的派生类才能用来定义对象。

抽象类

1.定义:

        抽象类是一种不能被实例化的类,即不能创建抽象类的对象,它主要用于定义一些具有相同属性和行为(方法)的类的公共接口,子类需要继承这个抽象类并实现其中的抽象方法。使用关键字abstract修饰的类称为抽象类。

2.特点:

        抽象类可以包含抽象方法和非抽象方法。抽象方法没有具体的实现,只有方法名、参数和返回值类型,没有方法体。

        子类继承抽象类后,必须实现抽象类中的所有抽象方法。如果子类没有实现某个抽象方法,那么子类也需要声明为抽象类。

        抽象类的构造方法可以被调用,子类可以通过super关键字调用父类的构造方法。

        抽象类可以有普通成员函数和数据成员。

纯虚函数和抽象类在面向对象编程中的意义

1.实现多态性:通过将基类中的某些函数声明为纯虚函数,可以在派生类中实现不同的行为。这样,在使用基类指针或引用调用这些函数时,实际调用的是派生类中的实现,从而实现了多态性。

2.提供统一的接口:抽象类可以为一组相关的类提供统一的接口。通过定义纯虚函数,抽象类规定了派生类必须实现的行为,从而确保了这些类具有一定的共性和可替代性。

3.强制实现特定的行为:抽象类中的纯虚函数强制派生类实现特定的行为。如果派生类没有实现所有的纯虚函数,那么该派生类也成为抽象类,不能被实例化。这确保了派生类具有一定的完整性和正确性。

4.便于代码的维护和扩展:使用纯虚函数和抽象类可以使代码更加易于维护和扩展。当需要添加新的功能或修改现有功能时,可以在抽象类中添加或修改纯虚函数,然后在派生类中实现相应的变化。这样,不会影响到现有的代码,提高了代码的可维护性。


原文地址:https://blog.csdn.net/Sunyanhui1/article/details/144408141

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!