java不带头节点的创建_C/C++中创建(带头结点、不带头结点的)单链表

1、带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法)

了解单链表中节点的构成

3694e1daffbe8e395b51466322085b80.png

从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义:

/* 定义链表 */

typedef struct Node{

int data; // 数据域

struct Node *next; // 指针域(后节点)

// struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表

}Node, *LinkedList;

尾插法思想

尾插法的思想其实很简单,通俗来讲就是每创建一个新节点都插到原来链表的后面。

ae7985c6f77b4196d4fe088bd4178c7c.png

!

80921e11474a67b3d0b606b692ed662d.png

691d4bbf92d250668a543b4e01f31929.png

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 带头结点 */

L = Head;

L->next = NULL;

/* 初始赋值 */

for(int i = 0; i < 3; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

L->next = LNew;

LNew->next = NULL;

L = LNew;

}

简单的代码

#include

using namespace std;

/* 定义链表 */

typedef struct Node{

int data;

struct Node *next;

}Node, *LinkedList;

/* 链表初始化 */

LinkedList LinkedListInit(){

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 带头结点 */

L = Head;

L->next = NULL;

/* 初始赋值 */

for(int i = 0; i < 10; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

L->next = LNew;

LNew->next = NULL;

L = LNew;

}

/* 返回头结点指针 */

return Head;

}

int main()

{

Node *p;

p = LinkedListInit();

p = p->next;

while(p != NULL){

cout << p->data << ' ';

p = p->next;

}

cout << endl;

return 0;

}

a8f74fc09a259ab58c3f7dc12adcd99b.png

2、不带头结点的单链表(原理与带头结点类似)

不带头结点与带头结点的区别

由于不带头结点的单链表第一个节点需要有效,因此,在处理第一个节点时,需要做节点迁移。

4416e7c8cf27bb4892774d60c3214280.png

7f882713dcce798743e1ca20524067c7.png

113c962d4288632c735b8652f0d6e999.png

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 不带头结点 */

L = Head = NULL;

/* 初始赋值 */

for(int i = 0; i < 4; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

LNew->next = NULL;

if(L == NULL){

L = Head = LNew;

}else{

L->next = LNew;

}

L = LNew;

}

简单的代码

#include

using namespace std;

/* 定义链表 */

typedef struct Node{

int data;

struct Node *next;

}Node, *LinkedList;

/* 链表初始化 */

LinkedList LinkedListInit(){

Node *Head, *L, *LNew;

/* 申请节点 */

Head = (Node *)malloc(sizeof(Node));

/* 不带头结点 */

L = Head = NULL;

/* 初始赋值 */

for(int i = 0; i < 5; ++i){

/* 申请节点 */

LNew = (Node *)malloc(sizeof(Node));

LNew->data = i;

LNew->next = NULL;

if(L == NULL){

L = Head = LNew;

}else{

L->next = LNew;

}

L = LNew;

}

/* 返回头结点指针 */

return Head;

}

int main()

{

Node *p;

p = LinkedListInit();

while(p != NULL){

cout << p->data << ' ';

p = p->next;

}

cout << endl;

return 0;

}

42a687f0eabdffd7941ba5e968fca6d2.png

JAVA单链表的实现-不带头结点但带有尾指针

1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾 ...

C语言写单链表的创建、释放、追加(即总是在最后的位置增加节点)

昨天周末给学妹讲了一些指针的知识,本来我对指针就是似懂非懂的状态,经过昨天一讲,我对指针的学习就更深刻了 果然给别人讲课也是学习的一个方法.加上最近复习数据结构,发现我的博客里没有链表的博文,所以趁这 ...

PHP数据结构之三 线性表中的单链表的PHP实现

线性表的链式存储:用一组任意的存储单元存储线性表中的数据元素.用这种方法存储的线性表简称线性链表. 链式存储线性表的特点:存储链表中结点的一组任意的存储单元可以是连续的,也可以是不连续的,甚至是零散分 ...

时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

&lbrack;CareerCup&rsqb; 2&period;6 Linked List Cycle 单链表中的环

2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of ...

链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

/*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的 ...

java编写带头结点的单链表

最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 ...

C实现头插法和尾插法来构建单链表(带头结点)

我在之前一篇博客中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天 ...

不带头结点的单链表------C语言实现

File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion L ...

随机推荐

Linux下一些有用的指令

1.   安装源代码包用到的configure 这用来定位安装位置. 用法: ./configure -prefix=,  前提是文件中有configure执行文件.

UVa 10007 - Count the Trees(卡特兰数&plus;阶乘&plus;大数)

题目链接:UVa 10007 题意:统计n个节点的二叉树的个数 1个节点形成的二叉树的形状个数为:1 2个节点形成的二叉树的形状个数为:2 3个节点形成的二叉树的形状个数为:5 4个节点形成的二叉树的 ...

工作上的C&sol;C&plus;&plus;相关

LKSnapShot.h的line127某个类的声明中有: public: typedef TClient _TClient; 这种情况 ...

CCNA training notes

5/29: vlan:virtual lan, 通过PVID来将物理上连通的host/PC划分到不同的局域网. switch的每个port有access与trunk两种mode,trunk模式的por ...

深入浅出 - Android系统移植与平台开发(十一)- Android系统的定制(瘋耔修改篇一)

首先非常感谢原文作者为我们提供的知识库,因为有你们的贡献,我们的开发难度更显简单 原文 :   http://blog.csdn.net/mr_raptor/article/details/30113 ...

ubuntu下google 拼音输入法的安装

google拼音输入法安装 (1).获代替码:(没有git的先安装git:sudoapt-get install git-core) $>gitclone git://github.com/tc ...

Eval与Bind的区别

bind和eval都是ASP.NET中的函数,而且都有对将数据获取到Html中的功能.那么,它们在使用的时候有什么区别呢?在我们编程的时候,在某种情况下,用哪个函数更加合适呢? 区别 用法: 1. b ...

字节码 反编译 APKTool 重新打jar包 MD

Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

OAuth简介(包含简明使用教程)

SSO:用户一次登陆后在多个系统免登录. 博客gem 'doorkeeper'  https://i.cnblogs.com/EditPosts.aspx?postid=9255973 OAuth:用 ...

electron写俄罗斯方块游戏(Tetris)

背景 在折腾ES6,突然想起大学时用c语言写过俄罗斯方块,本项目中主要是利用ES6的Class特性进行面向对象编程.项目采用node.js v6.2.0 + electron v1.1.0 进行桌面开 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值