单链表的创建方法(头插法、尾插法)

单链表的创建方法

单链表是数据结构中比较基础的结构了。对于单链表的的创建方法,比较容易想到的是头插法。但是当要求输入顺序与链表连接的顺序一致时,那么头插法就不是很友好了。因此了解单链表的尾插法也是很重要。
首先定义了单链表节点的数据结构ListNode,具体代码如下:

struct ListNode {
	int data;
	ListNode *next = NULL;
};

头插法

头插法,顾名思义就是从单链表的头指针处插入节点,优点是思路简单,比较符合单链表的正常思路,缺点就是插入顺序与链表连接顺序相反。头插法的操作步骤如下:

  1. 创建一个节点newNode;
  2. 保存头指针head.next的副本temp;
  3. 让头指针指向newNode,newNode.next指向temp;
    在这里插入图片描述
    代码实现:
void creatList_front(ListNode* const &h, const int &a) {
	ListNode *newNode = new ListNode;//步骤一
	newNode->data = a;//步骤一
	ListNode *temp = h->next;//步骤二
	h->next = newNode;//步骤三
	newNode->next = temp;//步骤三
}

尾插法

尾插法,就是从尾部插入节点的,优点是插入顺序与链表连接顺序一致。因为头插法有了头指针,所以尾插法要声明一个尾指针tail,它始终指向链表的最后一个节点,因此给定一个单链表时head时,要用尾插法插入节点必须先找到该链表最后一个节点,并让tail指向它,如果链表为空那么,tail = head;
尾插法的操作步骤:

  1. 创建尾指针tail,使tail指向链表的最后一个节点;
  2. 创建新节点newNode;
  3. 使tail->next指向新节点newNode;
  4. 让tail指向newNode;
    在这里插入图片描述

代码实现如下:

void creatList_back(ListNode * &t, const int &a) {//可以在外部先找到tail,再调用该函数
	ListNode *newNode = new ListNode;//步骤二
	newNode->data = a;//步骤二
	t->next = newNode;//步骤三
	t = newNode;//步骤四
}

综合两种方法来试一试:

先用头插法插入一部分数据,再用尾插法插入一部分,看看效果如何。

#include<iostream>
using namespace std;

struct ListNode {
	int data;
	ListNode *next = NULL;
};

/*头插法*/
void creatList_front(ListNode* const &h, const int &a) {
	ListNode *newNode = new ListNode;//步骤一
	newNode->data = a;//步骤一
	ListNode *temp = h->next;//步骤二
	h->next = newNode;//步骤三
	newNode->next = temp;//步骤三
}

/*尾插法*/
void creatList_back(ListNode * &t, const int &a) {//可以在外部先找到tail,再调用该函数
	ListNode *newNode = new ListNode;//步骤二
	newNode->data = a;//步骤二
	t->next = newNode;//步骤三
	t = newNode;//步骤四
}

int main() {
	ListNode* head = new ListNode;
	int a;
	/*先用头插法插入一部分数据*/
	while (cin >> a) creatList_front(head, a);
	cin.clear();
	cin.ignore();

	/*再用尾插法插入一部分数据*/
	ListNode *tail = head;
	while (tail->next != NULL)tail = tail->next;//找到尾结点
	while (cin >> a)creatList_back(tail, a);

	/*输出链表*/
	ListNode *p = head->next;
	while (p != NULL) {
		cout << p->data << ends;
		p = p->next;
	}
	return 0;
}

第一次输入:1 2 3 4 (ctrl+Z)
第二次输入:5 6 7 8 (ctrl+Z)
输出:4 3 2 1 5 6 7 8

运行结果:在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值