c++面试笔试总结

这篇博客总结了C++面试中关于链表反转的三种方法,包括双指针法、栈操作和使用vector。接着讨论了LRU缓存的设计,解释了如何使用单项循环链表和unordered_map实现LRU缓存,以及利用STL的list和unordered_map实现。
摘要由CSDN通过智能技术生成

c++面试笔试总结

第一题:反转链表

描述
给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头。

数据范围: n\leq1000n≤1000

要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:在这里插入图片描述

输入实例:输入{1,2,3} 输出{3,2,1};实例2: 输入{} 输出{}

方法一:利用两个链表,三个指针,分别为nex指针(用于保存原链表的表头指针),pre指针(用于保存新链表的表头指针Phead),cur指针(用于取下原链表节点并插入新链表中)
链表的结构定义为:

//结构体的定义
struct ListNode {
   
	int val;//值
	struct ListNode *next;//下一个节点
	ListNode(int x) :
			val(x), next(NULL) {
   
	}
};

//倒转链表
class Solution{
   
public:
	ListNode* ReverseList(ListNode* pHead){
   
		ListNode* cur = pHead;
		ListNode* pre = nullptr;
		ListNode* nex = nullptr;
	while(cur){
   
	//当cur为空的时候表示原链表已经摘取完,退出循环并返回新链表的表头
		nex = cur->next;
		cur->next = pre;
		pre = cur;
		cur = nex;
	}
return pre;
	}//ListNode
}

步骤如下:
在这里插入图片描述

方法二:利用栈解决,因为栈是一个先进先出的结构,将链表中的元素值取出,压入栈中(push),然后取栈顶指针,建立新的链表,然后pop()栈顶指针,直到栈空结束。时间复杂度和空间复杂度都较高。
方法三:利用vector容器保存节点指针。然后先令头指针指向最后一个结点,从倒数第二个元素开始反向遍历vector,后插法建立新的链表。
class Solution {
   
    public:
    ListNode*ReverseList(ListNode* pHead){
   
    if(pHead ==NULL||pHead->next == NULL)return pHead;
    vector<ListNode*>V;
    while(pHead){
   
        V.push_back(pHead);//指针依次将元素压入放入vector容器的后面
        pHead = pHead->next;
    }
     ListNode* Head = V[V.size()-1];//先将新链表的头指针指向Vector容器的尾
     ListNode* p = Head;//然后一次从倒数第二个元素开始使用尾插法建立新链表
     for (int i = V.size()-1;i>=0;i--){
   
         p->next = V[i];//修改当前指针的后续指向
         p = p->next;//移动链表的指针
     }
        //最后出来以后将p->next进行后续的赋空
     p->next = NULL;
     return Head;
  }
};

设计LRU 缓存结构

描述

设计LRU(最近最少使用)缓存结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值