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

  • 了解单链表中节点的构成



    从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义:
/* 定义链表 */
typedef struct Node{
int data; // 数据域
struct Node *next; // 指针域(后节点)
// struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表
}Node, *LinkedList;
  • 尾插法思想

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



    !

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 <iostream>
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;
}

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

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

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





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 <iostream>
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;
}

C/C++中创建(带头结点、不带头结点的)单链表的更多相关文章

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

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

  2. Python实现不带头结点的单链表

    1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # ...

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

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

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

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

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

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

  6. [CareerCup] 2.6 Linked List Cycle 单链表中的环

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

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

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

  8. 有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成。

    有一个线性表,采用带头结点的单链表L来存储,设计一个算法将其逆置,且不能建立新节点,只能通过表中已有的节点的重新组合来完成. 分析:线性表中关于逆序的问题,就是用建立链表的头插法.而本题要求不能建立新 ...

  9. java编写带头结点的单链表

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

随机推荐

  1. Windows 配置 nginx php 多版本切换

    1. 下载 nginx   nginx.org 2. 下载 php  windows.php.net   选择 nts 版本,解压后,将php.ini.development 重命名为  php.in ...

  2. unittest测试框架详谈及实操(五)

    测试报告——生成HTML格式的测试报告 前面的实例输出的所有测试结果都是以命令行日志的方式展示,不止于难看,但也不适合直接把那样的测试结果截图发给相关人员,尤其是领导.这时需要更加友好的测试结果,既能 ...

  3. HTML中的内容总结

    一.URL编码类型 对于Get方法,参数是直接通过URL传递的,那这个参数又是根据什么进行编码的呢?对于JSP网页,这个编码是通过第一句描述: <%@ page language="j ...

  4. win10家庭版系统安装SQL2005

    安装sql2005花了两天的时间,现在总结下,刚开始不知道win10家庭版系统没有本地用户和组的(详细说明 https://www.kafan.cn/A/5vz17o5jne.html) 一定要升级到 ...

  5. 在.net Core中使用StackExchange.Redis 2.0

    StackExchange.Redis 2.0做了大量的改进包括使用了高性能的IO库System.IO.Pipelines来提升性能以及解决Timeouts问题, 但是在.net Core2.2之前为 ...

  6. django 生命周期

    客户端发送请求 客户端(浏览器) → 发送请求 → 服务器(wsgi) → 解析请求 → 服务器(Middleware) → process_request → 服务器(urls) → 通过路由寻vi ...

  7. sqlserver 事务日志已满解决方案

    sqlserver 事务日志已满解决方案 可参考这篇博客: https://www.cnblogs.com/strayromeo/p/6961758.html 一.删除日志文件:(不建议) 二.手动收 ...

  8. 【leetcode 133. 克隆图】解题报告

    方法一:dfs(递归) map<Node*,Node*> dict; Node* clone(Node* node) { if (!node) return node; if (dict. ...

  9. binlog2sql

    从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 安装 shell> git clone https://gith ...

  10. Ubuntu的中文乱码问题

    目标:使系统/服务器支持中文,能够正常显示. 1.首先,安装中文支持包language-pack-zh-hans: $ sudo apt-get install language-pack-zh-ha ...