首页 > 其他分享 >链表

链表

时间:2022-08-27 22:57:56浏览次数:55  
标签:node head ListNode val next 链表

今天做美团笔试,第二题就,题目大概是:对于一串n个数字:1,2…n,给一串操作,每次把指定的数字移动到最左边(最前面),输出最后的结果

很明显,最直接的想法肯定就是模拟一个链表,每次把链表中的指定节点移动到链表头的位置

看起来这是很简单基础的对吧

但事实上自己做起来却是如此的不熟练,让我觉得其实自己根本就没有掌握链表于是有了这一篇,前事不忘后事之师

构造一串链表

#include <iostream>
#include <vector>
using namespace std;

struct ListNode {
	int val;
	ListNode* next;

	ListNode():val(),next(nullptr) {}
	ListNode(int value, ListNode* next) :val(value), next(next) {}
	ListNode(int value) :val(value), next(nullptr) {}
};

class LinkedList {
public:
	// 递归,从尾到头构造
	// 给一个数字,构造从1到n的链表出来
    // 返回链表的头指针
	ListNode* createLinkedList(int n) {
		// 只能从后往前构造
		ListNode* tail = new ListNode(n);
		ListNode* head = create(tail, n - 1);
		return head;
	}

	ListNode* create(ListNode* node, int n) {
		if (node->val == 1) return node;
		ListNode* newNode = new ListNode(node->val -1);
		newNode->next = node;
		create(newNode, n);
	}

	// 头插循环构造,从头到尾,需要一个虚拟头节点
	// 给一个数组,构造对应的链表出来
    // 返回链表头指针
	ListNode* createLinkedList(vector<int>& nums) {
		ListNode* virtualHead = new ListNode();
		for (int i : nums) {
			ListNode* node = new ListNode(i);
			node->next = virtualHead->next;
			virtualHead->next = node;
		}
		return virtualHead->next;
	}

	// 打印链表
	void printLinkedList(ListNode* head) {
		if (head==NULL) return;
		// printf("%d ", head->val);
		cout << head->val << " ";
		printLinkedList(head->next);
	}
};

int main() {

	LinkedList linkedList;
	//ListNode* head = linkedList.createLinkedList(5);
	//linkedList.printLinkedList(head);

	vector<int> nums = { 9,0 };
	ListNode* head = linkedList.createLinkedList(nums);
	linkedList.printLinkedList(head);

	return 0;
}

标签:node,head,ListNode,val,next,链表
From: https://www.cnblogs.com/yaocy/p/16631706.html

相关文章

  • 内核链表中list_entry的实现原理
    内核链表中list_entry的实现原理先使用内核链表实现数据的基本使用。#include<stdio.h>#include<stdlib.h>#include"kernel_list.h"//内核链表的头文件struct......
  • leetcode143-重排链表
    重排链表快慢指针+翻转链表通过快慢指针找到中间节点,然后将后半段进行翻转,然后与前半段进行拼接。classSolution{publicvoidreorderList(ListNodehead){......
  • 基础数据结构之链表相关的一些问题
    基础数据结构之链表相关的一些问题作者:Grey原文地址:博客园:基础数据结构之链表相关的一些问题CSDN:基础数据结构之链表相关的一些问题反转单链表题目描述见:LeetCode20......
  • LeetCode 链表的中间结点算法题解 All In One
    LeetCode链表的中间结点算法题解AllInOnejs/ts实现重排链表链表的中间结点原理图解//快慢指针functionmiddleNode(head:ListNode|null):ListNode|n......
  • 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能
    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。分析:线性表中关于逆序的问题,就是用建立链表......
  • leetcode147:对链表进行插入排序
    packagecom.mxnet;publicclassSolution147{publicstaticvoidmain(String[]args){}/***Q:给定单个链表的头head,使用插入排序对链......
  • LeetCode 92. 反转链表 II
    思路将子链表切割下来并记录左节点前一个节点pre和右节点下一个节点sucess反转子链表后,pre指向反转后的子链表,左节点(此时为子链表的尾节点指向sucess)/***Definition......
  • AcWIng 86. 分隔链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListN......
  • 贪吃蛇(C语言版)链表实现
    贪吃蛇gitee:贪吃蛇C语言版:Snake蛇的结构typedefstructSnake{ intx; inty; structSnake*next; };游戏开始欢迎界面//游戏开始欢迎界面voidmeun(){ p......
  • leetcode148:排序链表
    packagecom.mxnet;publicclassSolution148{publicstaticvoidmain(String[]args){}/***给你链表的头结点head,请将其按升序排列并......