1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上.因此,链表中结点的逻辑顺序与物理顺序不一定相同.为了正确表示节点间的逻辑关系,必须在存储线性表的每个数据元素的同时,存储指示其后继结点的地址信息,这两部分信息共同构成了单链表结点的结构,如下图: 结点包括两个域,数据域用来存放结点的值,指针域用来存…
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 比较喜欢用java语言,所以就使用java实现单链表了. 为了方便,带头结点的单链表更容易操作和使用,即第一个节点不存储值,可以存储一些标记等 一.创建单链表结构ListNode /** * @ProjectName: JavaPractice * @Package: com.itwang.swor…
1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ typedef struct Node{ int data; // 数据域 struct Node *next; // 指针域(后节点) // struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表 }Node, *LinkedList; 尾插法思想 尾插法的思想其实…
/*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍历找到最大的值,后进行删除 */ void Delete_Max(LinkList& L) { LNode *pre = L, *p = L->next; LNode *premax = pre, *max = p; while (p) { if (max->data < p->…
/*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的功能是删除以L->next为首结点指针的单链表中所有值等于x 的结点.递归模型如下: 终止条件:f(L,x)=不做任何事情 若L为空表 递归主体:f(L,x)=删除*L结点;f(L->next,x); 若L->data == x f(L,x)=f(L->next,x) 其他情况 */…
1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链表示意图: 链表指针直接指向了首元节点,因此在首元节点前插入数据元素或者删除首元节点元素都会改变头指针的值. 3,不带头结点的单链表定义及操作集合,除了插入,删除,清空操作需要传递头指针的地址外,基本上一样.头文件defs.h 1 #ifndef _DEFS_H_ 2 #define _DEFS_H…
本篇文章的代码大多使用无头结点的单链表: 相关定义: #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef int DataType; typedef struct Linklist{ LDataType data; struct Linklist *next; }Linklist,*pLinklist; 相关函数的定义: pLinklist BuyNewNode(LDataType dat…
有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新结点,也就不能把元素重新弄到一个表中.可以将L中的元素作为逆转后的L的元素来源,将L->next设置为空.然后将头结点后的一串结点用头插法逐个插入L中. 伪代码: void reversel(LNode *L) { LNode *p=L->next, *q; L->next=NULL; //…
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表中插入和删除元素时,主要是改变指针的值,其时间复杂度为1.而顺序存储的话,其时间复杂度为n. 在单链表中求长度时不如顺序存储结构,其时间复杂度为n: 而顺序存储是1.故可以在链表头结点中设置一个长度值,在插入数据元素时加1,在删除数据元素时减1. 在单链表中查找指定数据元素时,其时间复杂度和顺序存草…
本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表.当读到−1时表示输入结束,函数应返回指向单链表头结…
温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助! #include<iostream> using namespace std; typedef struct Lnode { char data; struct Lnode *next; }LN; LN *CreateLinkList() { LN *head,*p,*pre; char ch; ; head=(LN *)malloc(sizeof(LN)); head->next=NULL; pr…
File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion List: *****************************************************/ #include <stdio.h> #include <stdlib.h> typedef struct node { int id; struct node *…
1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # 创建一个单链表类 9 class SingleLink: 10 def __init__(self): 11 self.header = None # 初始化单链表的头结点 12 self.length = 0 # length:单链表的长度 13 14 # 判断单链表是否为空 15 def is_…
<1>链表 <2>引用和基本类型 <3>单链表 //================================================= // File Name : LinkList_demo //------------------------------------------------------------------------------ // Author : Common //类名:Link //属性: //方法: class Link…
1.介绍: 链表是有序的列表,但是它在内存的存储如下:  链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表和不带头节点的链表,根据实际的需求来确定 单链表(带头节点) 2.应用实例 使用带head头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作 第一种方法在添加英雄时,直接添加到链表的尾部 第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)…
#include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList(Node* &head) { head = new Node; int elem; cin>>elem; head->elem = elem; Node *p = head; while(cin>>elem&&elem) { Node *q = new…
算法复杂度0(n) #!/usr/bin/env python3 class LNode(object): def __init__(self, elem, next_=None): self.elem = elem self.next = next_ class Rm_Small_List(object): def __init__(self): self.head = None self.num = 0 def prepend(self, elem): self.head = LNode(e…
// ListNode typedef struct LNode { int key; struct LNode *next; }LNode;   分析:这是一道很有意思的面试题,此题以及此题的变体经常出现在各大公司的面试.笔试中. 看到这道题后,第一反应是从头到尾输出比较简单.然后经过分析,这道题有以下几种解决方法: 将链表中节点的指针反转过来,然后在从头到尾输出节点中的值 当要倒置输出值时,我们会想到用栈来实现.所以这种方法是,遍历链表节点中的值,依次入栈,最后弹栈输出 仔细分析这两种方法,…
一.首先,看看单链表中第i个元素的删除: Status ListDelete_L (LinkList &L,int i,ElemType &e){ //在带头结点的单链表L中,删除第i个元素,并由e返回其值 p=L;j=0; while(p->next&&j<i-1){                     //寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if(!(p->next)||j<i-1)return ERR…
问题:求单链表倒数第m个结点,要求不准求链表的长度,也不许对链表进行逆转 解:设置两个指针p和q,p.q指向第一个结点.让p先移动到链表的第m个结点,然后p和q同时向后移动,直到p首先到达尾结点.此时,q结点落后p (m-1)个结点,q所指向的结点就是单链表的倒数第m个结点. 算法实现: linkNode *searchLinkM(linkNode *link,int m) { linkNode *p=link->next; ) { ;i<m;i++) { p=p->next; if(p…
最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的. 主要代码: //反转单链表. void reverse(linklist lList) { Linknode *pre = NULL; //注意该结点不能再指向别的非空结点. Linknode *cur = lList->next; Linknode *next; while(cur) { next = cur->next; cur->next = pre; p…
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一, 示例: 第一种情况: 链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可: 第二种情况: 链表走到结尾时,如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.…
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java…
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte…
不带头结点的单链表,递归法比较简明!(必背!) 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建第一种方法:递归的终止条件:e为0 void CreatList(List &T) { int e; cin>>e; ) T=NULL; else { T=(List)malloc(sizeof(Node)); T->data=e; CreatList(T->next); } } 第…
题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3->4->5->6->7->8 解析 按照以下步骤处理: 按照奇偶位拆分为两个链表 反转偶数结点构成的链表 合并两个递增链表 Python实现 # -*- coding:utf-8 -*- class Node(object): def __init__(self, val=None…
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node…
我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天我们就来实现一下带头结点链表的头插和尾插. 代码上传至 https://github.com/chenyufeng1991/HeadInsertAndTailInsert_HeadNode . 核心代码例如以下: //创建带头结点的单链表(尾插法) void CreateListTailInsert(Node…
可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址的部分称为指针域. 2;结点示意图: 3;头指针:头指针始终指向链表第一个元素,当有头结点时头结点就是链表第一个元素.头指针具有标识左右,故头指针命名为链表的名字,这里为linklist.头指针是一定存在的. 4;头结点:引入头结点的目的是,将链表首元结点的插入和删除操作与其他结点的插入和删除操作统…
由于这个很简单,他也貌似没要判断溢出,取巧突破 #include<stdio.h> #include<malloc.h> #include<stdlib.h> //函数状态码定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int ElemType; //假…