线性表-链表

一、链表

链表的题目一般不难,主要考查coding能力。

1.链表相加

给定2个链表,分别表示2个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字。计算这两个数的和,并返回和的链表头指针。

【分析】leetcode第2题。

逆序存储的好处是,可以从头指针开始,逐位计算当前位和进位,依次放入表示和的链表中。

【扩展思路】上述逆序链表这个结构其实非常巧妙,还可以用来实现大数运算。(我以前都是用数组做=,=,数组的好处是可以随机访问,做乘法方便定位,,但链表做乘法嘛……呃,需要多用辅助指针……)

【我的代码:4ms】

2. 链表翻转

给定一个链表,翻转该链表第m到第n个位置。要求直接翻转而非申请新空间。如,给定1,2,3,4,5,m=2, n=4, 返回1,4,3,2,5。

【分析】leetcode 第92题。

一般使用头插法,把后面的结点依次插入头结点前面,注意是依次。这样,只需要一个指针记录参考结点,一个指针遍历待翻转结点,一个计数器。

【我的代码】0ms

3.链表去重

给定排序的链表,删除重复元素,只保留第一次出现的结点。

【分析】leetcode第83题。

很简单,因为链表已经有序了,直接删除后面相同的元素即可。

【我的代码】1ms。

4. 链表划分

给定一个链表和一个值x,将链表划分为两部分,使得小于x的结点在前,大于等于x的结点在后。在这两部分中要保持原链表中的出现顺序。

【分析】leetcode第86题。

有点类似于快排中的partition过程。但注意到链表的特殊结构,可以直接申请2个指针,把小于x的结点都插入第一个指针后面,大于等于x的结点都插入第2个指针后面,最后再把这2个链表接起来就可以了。时间复杂度为n,空间为2.

【思路扩展】快速排序也可以用单链表结构存储。但注意不是所有排序都适合单链表结构,比如堆排序就不适合。

【我的代码】1ms。

5.单链公共结点问题

给定2个单向链表,计算两个链表的第一个公共结点。若没有公共结点,返回空。

【分析】leetcode第160题。

注意是单向链表,所以在公共结点之后的所有结点是相同的,不可能出现x形结构。因此,可以先遍历2个链表,得到长度m,n。然后长链表先走|m-n|步,然后同步走,直到指向同一个结点。

【思路扩展】如果是链表中存在环,则需要用快慢指针的方式计算公共结点。即2个指针,每次分别移动1步或2步。

【我的代码】2ms。

时间: 2024-10-20 00:58:16

线性表-链表的相关文章

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

线性表--链表(PHP实现)

上一篇文章写了线性表的基本概念以及用C语言实现链表,有兴趣的同学可以看看:线性表--链表(C语言实现). 现在,我们来看看用PHP来实现链表. 我们都知道,链表由一个个结点组成.在c语言中,我们用结构来定义一个结点,那么在PHP中我们用什么来定义结点? 当然是类. <?php //用面向对象的思想定义结点 class Node { public $value; public $next = null; } 先给出创建和遍历链表的代码,我们再说说链表的插入和删除操作,比起用顺序存储结构实现线性表的

数据结构(二)线性表——链表

通常情况下,链接可分为单链表.双向链表和循环链表三种常用类型. 一.单链表基本操作的实现 使用链式存储结构来实现的线性表称为链表.首元结点.头结点.头指针.空指针. 1.单链表的类型定义 typedef struct LNode//结点类型 { LElemType data;//数据域 struct LNode * next;//指针域 } LNode, * LinkList; 2.初始化操作InitLinkList(&L) Status InitLinkList(LinkList &L)

线性表链表实现

1 #include<bits/stdc++.h> 2 using namespace std; 3 #define sc scanf 4 #define ElemType int 5 //线性表的链式表示和实现 6 7 typedef struct LNode{ 8 int data; 9 struct LNode *next; 10 }LNode,*LinkList; 11 //关于上面为啥是这样子的,看下面链接即可 12 //https://zhidao.baidu.com/questi

线性表-链表(三)

一.单链表基本操作 (1)清空单链表 while(L->next){ p=L->next; L->next=p->next; free(p); } 分析:p 指向L的 next 域,L的 next域 在指向 p 的 next 域(p=L->next),其实就是L指向了 L 的 next 的 next 域.然后清空 p 不断循环,知道 L->next == NULL (2)销毁单链表 while(L){ p=L->next; free(L); L=p; } (3)单

作业1 线性表 链表 的定义和实现

1 #include <iostream> 2 using namespace std; 3 4 5 template<class T> 6 struct SLNode 7 { 8 T data; 9 SLNode<T>* next; 10 SLNode(SLNode<T>*nextNode=NULL){next=nextNode;} 11 SLNode(const T&item,SLNode<T>*nextNode=NULL) 12 {

线性表-链表(一)

一,定义 什么是单链表呢? 单链表是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点都包含指向下一个节点的链接,也就是指针 单链表的特点是什么呢? - 数据元素在 逻辑关系上相邻 ,用指针表示 - 单链表 中访问数据元素时需从头开始,即顺序访问 - 比顺序表的优势在于,提供高效的重排数据项的能力 C代码: typedef struct LNode { ElemType data: struct LNode *next: }LNode, *LinkList: 其中 data 是数据域

线性表-链表(四)

一.循环链表 什么是循环链表? 最后一个结点的链接又指回头结点(第一个结点)的链表,整个链表形成一个环.与单链表相比,操作时判断最后一个结点的条件为:结点的链接是否为头结点 空表 条件:L->next==L 非空表 条件 p->next==L 二.双向链表 -什么是双向链表? 用两个链接表示元素间的逻辑关系,其一指向直接后继,其二指向直接前驱. 算法描述 typedef struct DuLNode{ Elem Type data; struct DuLNode *prior; struct

06 线性表 链表概述

链表结构: 链表分类:带头结点    不带头结点 表示一个空表: 原文地址:https://www.cnblogs.com/CPU-Easy/p/11689548.html

线性表-链表(二)

一,单链表的插入 (1)单链表如何插入一个新元素呢? 在单链表中 有序对: 变成 图例: 注意:在单链表中插入只需要修改指针.若要在第 i 个结点之前插入元素,修改的是是第 (i-1) 个结点的指针. (2)单链表的插入元素的代码怎么写呢? 代码如下: Status ListInsert(LinkList &L, int i ,ElemType e){ p=L; j=0; while(p && j<i-1){ p=p->next; ++j; } if(p &&a