Leetcode剑指Offer学习计划第二天题目

2023-11-06

剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入: head = [1,3,2] 输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

所给代码如下

/**
 1. Definition for singly-linked list.
 2. struct ListNode {
 3.     int val;
 4.     ListNode *next;
 5.     ListNode(int x) : val(x), next(NULL) {}
 6. };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {

    }
};
思考:

要把链表元素逆序打印,我现在可以想到实现逆序的有

  1. 可以数组从尾到头逆序打印
  2. 可以链表逆置再打印
  3. 可以用出栈入栈的性质来实现逆序

这题目的标签是栈,数组,链表,双指针,也就是说用栈就行,双指针现在也没有做过相关题目,如果以后接触到了可以回头再考虑这个题目。
画个草图来辅助做题:
在这里插入图片描述
步骤已经很明确了,遍历链表元素并且入栈,然后出栈直到栈空。
用代码实现

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
		vector<int> arr;
		stack<int> newStack;
		ListNode* tmp = head;
		while(tmp != nullptr) {
			newStack.push(tmp->val);
			tmp = tmp->next;
		}
		while(!newStack.empty()) {
			arr.push_back(newStack->top());
			newStack.pop();
		}
		return arr;
    }
};
剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

题目给出代码框架:

/**
 1. Definition for singly-linked list.
 2. struct ListNode {
 3.     int val;
 4.     ListNode *next;
 5.     ListNode(int x) : val(x), next(NULL) {}
 6. };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {

    }
};
思考:

这个题目其实和基本的链表操作没有差多少
在这里插入图片描述

  1. 先构造两个结点,pre指向空,current指向head
  2. 再按照以往的操作基本向后遍历即可
答案
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* currentNode = head;
		ListNode* pre = nullptr;
		while(currentNode != nullptr) {
			ListNode* tmpNode = currentNode->next;	// 这是下次移动的位置
			currentNode->next = pre; // 把current指向原来next的指针指向pre
			pre = currentNode;	// pre向后移动到原来current的位置
			currentNode = tmpNode;	// current向后移到了原来tmp的位置
		}
		return pre;
    }
};
剑指 Offer 35. 复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 1:
在这里插入图片描述

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

题目给代码框架:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/
class Solution {
public:
    Node* copyRandomList(Node* head) {
        
    }
};

思考:

  1. 看到这个题目,首先会想到可以把random随即节点和next节点分开处理
  2. 这个题目的标签是链表和哈希,但是比较熟悉的是链表操作,比较菜的水平就用菜的方法,直接上链表,搞细胞分裂了
  3. 细胞分裂是先复制材料再分裂,这个题目也一样,处理next节点和普通的链表插入操作一样
  4. 创建新节点cpNode,把当前节点的值传给cpNode,然后从头到尾遍历插入即可完成next的复制工作
  5. 然后处理random,在做这个题目的时候也是不太能理解要怎么写这个代码,还是要感谢一位学长画这个图给我看,瞬间就明白了其实lc官方给的图可以简化成这样来辅助理解
    在这里插入图片描述
  6. 细胞分裂材料复制完毕后完就可以进行分裂了。把复制体分开即可
答案
class Solution {
public:
    Node* copyRandomList(Node* head) {
		if(head == nullptr) {
			return nullptr;
		}
		// 复制next
		Node* tempNode = head;
		while(tempNode != nullptr) {
			Node* cpNode = new Node(tempNode->val);
			cpNode->next = tempNode->next;
			tempNode->next = cpNode;
			tempNode = cpNode->next;
		}
		
		// 复制random
		tempNode = head;
		while(tempNode != nullptr) {
			if(tempNode->random != nullptr) {
				tempNode->next->random = tempNode->random->next;	//正如思考5里画的那样
			}
			tempNode = tempNode->next->next;
		}
		
		// 开始细胞分裂
		tempNode = head->next;
		Node* pre = head;
		Node* cpHead = head->next;
		while(tempNode->next != nullptr) {
			pre->next = pre->next->next;
			tempNode->next = tempNode->next->next;
			pre = pre->next;
			tempNode = tempNode->next;
		}
		pre->next = nullptr;
		return cpHead;
	}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode剑指Offer学习计划第二天题目 的相关文章

  • Android中保存图片到本地功能实现

    本文描述将一个Bitmap对象保存为一个图片文件的主要步骤 保存的图片文件能够立刻在系统相册和图库中找到 主要步骤 这里只介绍按下 保存 后如何将一个Bitmap对象保存为图片文件的执行步骤 对图片的下载 图片到Bitmap对象的转换 Bi
  • Unity如何获取鼠标当前帧和上一帧的屏幕坐标差

    在实际开发过程中 经常用到获取鼠标当前帧和上一帧的屏幕坐标差 今天我就简单写一个框架 希望对大家有所帮助 注意在计算两帧坐标时 一定要记得把第一帧去除 否则会出现跳动 给人以不连续感觉 FR 海涛高软 Hunk Xu QQ群 3864767
  • Java中的运行时异常

    Throwable 是所有 Java 程序中错误处理的父类 有两种子类 Error 和 Exception Error 表示由 JVM 所侦测到的无法预期的错误 由于这是属于 JVM 层次的严重错误 导致 JVM 无法继续执行 因此 这是不
  • 软件工程专业计算机毕设选题推荐

    同学们好 这里是海浪学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难
  • 【MySQL数据库

    目录 编辑 前言 DML介绍 语法详情 1 插入数据 特点 1 给指定字段添加数据 代码示例 运行结果 2 给所有的字段添加数据 代码示例 运行结果 3 批量添加数据 代码示例1 运行结果1 代码示例2 运行结果2 2 修改数据 有条件的代
  • MyBatis传入参数为list、数组、map写法

    1 美图 如果传入的参数只是一个list
  • Kafka消费者之Offset、重复消费、消费者事务及消息积压

    一 offset 位移 1 1 offset 的默认维护位置 consumer offsets 主题里面采用 key 和 value 的方式存储数据 key 是 group id topic 分区号 value 就是当前 offset 的值

随机推荐