数据结构 链表【记录:单链表的操作】

71 篇文章 12 订阅
41 篇文章 1 订阅

注:本文不做详细讲解,注释仅在代码段中,作个人记录使用

详解请看往日博客记录:博客类型为数据结构或算法

目录

目录

一、链表的结构

二、链表的头插法

三、链表的尾插法

四、链表的长度

五、链表的插入

六、链表的删除

七、单链表反转

八、打印链表

九、链表的释放

十、判断链表是否有环

十一、输出单向链表中倒数第K个结点 

十二、求两个链表的公共交点


一、链表的结构

//链表的结构
typedef struct Node
{
	int data;
	Node* next;
}Node,*LinkedList;

二、链表的头插法

//链表的头插法
LinkedList creatH()
{
	//创建头结点,为头结点分配空间
	Node* head = (Node*)malloc(sizeof(Node));
	//头结点的next域置空
	head->next = NULL;

	int value;
	while (cin >> value)
	{
		Node* p = (Node*)malloc(sizeof(Node));
		p->data = value;
		p->next = head->next;
		head->next = p;
	}
	return head;
}

三、链表的尾插法

//尾插法
LinkedList creatT()
{
	//创建头结点,为头结点分配空间
	Node* head = (Node*)malloc(sizeof(Node));
	//头结点的next域置空
	head->next = NULL;
	//创建当前指针cur;
	Node* cur = head;

	int value;
	while (cin >> value)
	{
		Node* p = (Node*)malloc(sizeof(Node));
		p->data = value;
		p->next = cur->next;
		cur->next = p;
		cur = p;
	}
	return head;
}

四、链表的长度

//求长度
int getLength(LinkedList L)
{
	int length = 0;
	Node* cur = L->next;
	while (cur != NULL)
	{
		length++;
		cur = cur->next;
	}
	return length;
}

五、链表的插入

//插入结点
void insertList(LinkedList L,int loc,int val)
{
	if (loc <1 || loc> getLength(L))
	{
		cout << "插入范围有误!" << endl;
		return;
	}
	//指向头结点
	Node* cur = L;
	for (int i = 1; i < loc; i++)
	{
		cur = cur->next;
	}
	//创建结点
	Node* p = (Node*)malloc(sizeof(Node));
	p->data = val;
	//插入结点
	p->next = cur->next;
	cur->next = p;
	cout << "插入成功!" << endl;
}

六、链表的删除

//删除结点
void deleteList(LinkedList L, int loc)
{
	if (loc <1 || loc> getLength(L))
	{
		cout << "删除范围有误!" << endl;
		return;
	}
	//指向头结点
	Node* cur = L;
	for (int i = 1; i < loc; i++)
	{
		cur = cur->next;
	}
	Node* del = cur->next;
	cur->next = del->next;
	free(del);
	del = NULL;
}

七、单链表反转

//单链表反转
LinkedList reverseList(LinkedList& L)
{
	Node* head = L;
	//指向当前结点
	Node* cur;
	//存放后续链表
	Node* nex;
	//新链表
	Node* pre = NULL;
	cur = L->next;
	free(head);
	head = NULL;
	while (cur != NULL)
	{
		nex = cur->next;
		cur->next = pre;
		pre = cur;
		cur = nex;
	}
	Node* newHead = (Node*)malloc(sizeof(Node));
	newHead->next = pre;
	return newHead;
}

八、打印链表

//打印链表
void printList(LinkedList L)
{
	Node* cur = L->next;
	while (cur)
	{
		cout << cur->data << " ";
		cur = cur->next;
	}
	cout << endl;
}

九、链表的释放

//链表的释放
void releaseList(LinkedList L)
{
	Node* cur = L;
	Node* nex = L;
	while (cur)
	{
		nex = nex->next;
		free(cur);
		cur->next = NULL;
		cur = nex;
	}
}

十、判断链表是否有环

bool isCycle(LinkedList L)
{
	Node* slow = L->next;
	Node* fast = L->next;
	while (1)
	{
		fast = fast->next;
		if (fast == nullptr)
		{
			return false;
		}
		fast = fast->next;
		if (fast == nullptr)
		{
			return false;
		}
		slow = slow->next;
		if (fast == slow)
		{
			return true;
		}
	}
}

十一、输出单向链表中倒数第K个结点 

Node* Number(LinkedList L)
{
	//记录链表的长度
	int k;
	cin >> k;
	//设置快慢指针,起点均为头结点
	Node* fast = L;
	Node* slow = L;
	if (k == 0)
	{
		slow->data = 0;
		return slow;
	}
	for (int i = 0; i < k; i++)
	{
		fast = fast->next;
	}
	while (fast != NULL)
	{
		fast = fast->next;
		slow = slow->next;
	}
	return slow;
}

十二、求两个链表的公共交点

长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL。
长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。 

Node* FindFirstCommonNode(LinkedList L1, LinkedList L2)
{
	Node* head1 = L1->next;
	Node* head2 = L2->next;
	Node* p1 = head1;
	Node* p2 = head2;
	while (p1 != p2)
	{
		p1 = (p1 == nullptr ? head2 : p1->next);
		p2 = (p2 == nullptr ? head1 : p2->next);
	}
	return p1;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值