力扣 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)!