目录
一、单链表
1.单链表的六大解题套路,你都见过么?
(1)21. 合并两个有序链表
(2)23. 合并K个升序链表
(3)19. 删除链表的倒数第 N 个结点
(4)876. 链表的中间结点
(5)141. 环形链表
(6)160. 相交链表
2.递归反转链表:如何拆解复杂问题
(1)206. 反转链表(递归)
(2)92. 反转一部分链表 (递归)
3.递归思维:k 个一组反转链表
(1)25. K 个一组翻转链表 (迭代)
4.经典面试题:最长回文子串
(1)125. 验证回文串
(2)5. 最长回文子串
5.如何高效判断回文单链表?
(1)234. 回文链表
一、单链表 1.单链表的六大解题套路,你都见过么?
p->next=p1:表示节点p的下一个节点是p1
p=p->next:表示向前移动,修改指针p的位置,把p指向原来的下一个节点。
(1)21. 合并两个有序链表 (2)23. 合并K个升序链表优先队列
(3)19. 删除链表的倒数第 N 个结点快慢指针
(4)876. 链表的中间结点快慢指针
(5)141. 环形链表快慢指针
(6)160. 相交链表注意这段代码:p1永远都不会是nullptr
if(p1->next)
{
p1=p1->next;
}
else{
p1=headB;
}
2.递归反转链表:如何拆解复杂问题
(1)206. 反转链表(递归)
ListNode* reverseList(ListNode* head) {
if(head==nullptr)
{
return nullptr;
}
if(head->next==nullptr)
{
return head;
}
ListNode* node=reverseList(head->next);
head->next->next=head;
head->next=nullptr;
return node;
}
(2)92. 反转一部分链表 (递归)
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) {}
};
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(left==1)
{
return reverseN(head,right);
}
head->next=reverseBetween(head->next,left-1,right-1);
return head;
}
//反转前n个结点
ListNode* successor=nullptr;
ListNode* reverseN(ListNode* head,int n)
{
if(head==nullptr)
{
return nullptr;
}
if(n==1||head->next==nullptr)
{
successor=head->next;
return head;
}
ListNode* last=reverseN(head->next,n-1);
head->next->next=head;
head->next=successor;
return last;
}
3.递归思维:k 个一组反转链表
(1)25. K 个一组翻转链表 (迭代)
class Solution {
public:
int i=0;
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode *a = head , *b = head ;
ListNode *myNode=new ListNode(-1);
ListNode *p=myNode;
if(!head||!head->next)
{
return head;
}
while(i < k && b)
{
b=b->next;
++i;
if(i==k)
{
myNode->next = reverse(a,b);
for(int j=0;jnext->val<next;
}
a=b;
i=0;
}
else if(b==nullptr)
{
myNode->next=a;
}
}
return p->next;
}
//反转a与b之间的结点[a,b]
ListNode* reverse(ListNode* a,ListNode* b)
{
ListNode *currentNode=a,
*lastNode=nullptr,
*nextNode=nullptr;
while(currentNode!=b)
{
nextNode=currentNode->next;
currentNode->next=lastNode;
lastNode=currentNode;
currentNode=nextNode;
}
cout<<"lastnode:"<val<
4.经典面试题:最长回文子串
(1)125. 验证回文串
- 快慢指针,判断相不相等。
- 字符串转大小写:
- 方法1:遍历,大写的字符+32为小写;
- 方法2:
#include
std::transform(s.begin(), s.end(), s.begin(), toupper);
(2)5. 最长回文子串
一个一个遍历,求出以该元素为中点时的回文子串(注意while判断时,两个元素相等才i--,j++),判断回文串大小。
5.如何高效判断回文单链表? (1)234. 回文链表(链表不能倒序遍历)找到链表中心点,将后半部分反转,然后对比。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)