1. 完成 143. 重排链表
题目要不能只改变值,所以不能用stack(栈)实现 单纯值操作。
法一:利用线性表vector,vector<ListNode*>vec;这句代码实现储存操作,采用中断处理,代码:if(i==j){
break;)实现。
法二:经典操作:找链表中点,反转链表,合并链表。
法一代码如下:
/*** 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:void reorderList(ListNode* head) {if(head==nullptr)return ;vector<ListNode*>vec;//使用节点线性表ListNode*p=head;//储存节点while(p){vec.emplace_back(p);p=p->next;}int i=0,j=vec.size()-1;//数组大小下表减1 才是数组最后下标while(i<j){//交替重置链表vec[i]->next=vec[j];i++;//实现交替操作if(i==j){break;}vec[j]->next=vec[i];j--;}vec[i]->next=nullptr;}
};
法二代码:
/*** 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:void reorderList(ListNode* head) {if(head==nullptr){return;}ListNode*mid=middlNode(head);ListNode*l1=head;ListNode*l2=mid->next;mid->next=nullptr;//重置节点l2=reverseList(l2);mergeList(l1,l2);}//找链表中点ListNode*middlNode(ListNode*head){ListNode*slow=head;ListNode*fast=head;//经典快慢指针操作 你走一步 我走两步 我们始终是两倍差距while(fast->next!=nullptr&&fast->next->next!=nullptr){//奇偶差别slow=slow->next;fast=fast->next->next;}return slow;}//反转链表ListNode*reverseList(ListNode*head){ListNode*prev=nullptr;ListNode*curr=head;//经典三变量问题 终止条件为 curr->next==nullptr //不断实现将头节点放在链表最后while(curr!=nullptr){ListNode*nextTemp=curr->next;curr->next=prev;prev=curr;curr=nextTemp;}return prev;}/*经典递归反转ListNode*reverseList(ListNode*head){if(head->next==nullptr||head->next->next==nullptr){return head;}ListNode*newNode=reverseList(head->next);head->next->next=head;head->next=nullptr;}*///交替插入链表void mergeList(ListNode* l1, ListNode* l2) {ListNode* l1_tmp;ListNode* l2_tmp;while (l1 != nullptr && l2 != nullptr) {l1_tmp = l1->next;l2_tmp = l2->next;l1->next = l2;l1 = l1_tmp;l2->next = l1;l2 = l2_tmp;}}};
2. 八股部分
1) 什么是多态性?C++中如何实现多态?
多态性是指通过基类指针或调用派生类的函数,实现不同的行为。
多态性可以提高代码的灵活性和可拓展性,使程序能够根据不同的对象类型执行不同的操作。
2) 多态性的好处是什么?
可以使代码更加灵活,易于扩展和维护。
例如。在一个动物描述程序中,可以使用多态性来处理不同类型的动物对象,只需要一个统一的接口来绘制各种图形,而不需要为每种图形都编写单独的绘制函数。
同时,多态性也可以提高代码的可重用性,减少重复代码的编写。