链表相关操作

#include <iostream>
#include <stack>
using namespace std;
//链表结构体
struct ListNode
{
	int m_nValue;
	ListNode*m_pNext;
};
//是否为空
bool isEmpty(ListNode*list){
	return list->m_pNext == NULL;
}
//position是否是最后一个
bool isLast(ListNode*position, ListNode*list){
	return position->m_pNext == NULL;
}
//在链表中找到某个元素
ListNode* Find(int value, ListNode*list){
	ListNode*pNode = list->m_pNext;//指向第一个
	while (pNode!=NULL&&pNode->m_nValue!=value)
	{
		pNode = pNode->m_pNext;
	}
	return pNode;
}
//找到某一个元素的前驱节点
ListNode* FindPrevious(int value, ListNode*list){
	ListNode*pNode = list;//指向头结点
	while (pNode->m_pNext!=NULL&&pNode->m_pNext->m_nValue!=value)
	{
		pNode = pNode->m_pNext;
	}
	return pNode;
}
//移除某个节点
void deleteNode(int value, ListNode*list){
	if (list==NULL)
	{
		return;
	}
	ListNode* pToBeDeletedNode=NULL;
	ListNode* pNode=list;
	//pNode = FindPrevious(value, list);//找到之前的节点
	while (pNode->m_pNext != NULL&&pNode->m_pNext->m_nValue != value)
	{
		pNode = pNode->m_pNext;
	}
	if (pNode->m_pNext!=NULL) //不是最后一个
	{
		pToBeDeletedNode = pNode->m_pNext;//待删除的节点
		pNode->m_pNext = pToBeDeletedNode->m_pNext;//指向待删除节点的下一个节点
        //释放待删除的节点
		delete pToBeDeletedNode;
		pToBeDeletedNode = NULL;
	}
	else{ //不存在这个节点
		return;
	}
}
//将一个元素插入到pToBeInsertedNode指示的节点之后,元素的值为value
void insertNode(int value, ListNode*list, ListNode*pToBeInsertedNode){
	if (list==NULL||pToBeInsertedNode==NULL)//不合法
	{
		return;
	}
	ListNode*pNewNode = new ListNode();
	if (pNewNode==NULL) //分配失败
	{
		return;
	}
	pNewNode->m_nValue = value;
	pNewNode->m_pNext = pToBeInsertedNode->m_pNext;
	pToBeInsertedNode->m_pNext = pNewNode;
}
//在末尾添加元素
void addToTail(ListNode*list, int value){
	//一个新的节点
	ListNode*pNewNode = new ListNode();
	if (pNewNode==NULL) //申请失败
	{
		return;
	}
	pNewNode->m_nValue = value;
	pNewNode->m_pNext = NULL;

	if (list==NULL) //链表为空,那就等于头节点
	{
		list = pNewNode;
	}
	else{
		ListNode*pNode = list;

		while (pNode->m_pNext!=NULL)
		{
			pNode = pNode->m_pNext;
		}
		pNode->m_pNext = pNewNode;//最后一个的下一个节点指向新节点
	}
}
//删除整个链表
void deleteList(ListNode*list){
	if (list==NULL)
	{
		return;
	}
	ListNode*pNode = list->m_pNext;
	ListNode*pTemp = NULL;

	list->m_pNext = NULL; //断开头结点
	while (pNode!=NULL)
	{
		pTemp = pNode->m_pNext;//需要保存其下一个节点
		delete pNode;
		pNode = pTemp;        //移到下一个节点
	}
}
//打印链表
void printList(ListNode*list){
	if (list==NULL)
	{
		return;
	}
	ListNode*pNode = list->m_pNext;
	while (pNode!=NULL)
	{
		cout << pNode->m_nValue << " ";
		pNode = pNode->m_pNext;
	}
	cout << endl;
}
//逆序打印链表
void printListReversingly(ListNode*list){
	stack<ListNode*> nodes;

	ListNode*pNode = list->m_pNext; //不压入头部
	while (pNode!=NULL)
	{
		nodes.push(pNode);//压栈
		pNode = pNode->m_pNext;
	}
	while (!nodes.empty()){  //不为空
		ListNode*pTemp = nodes.top(); //获取顶端元素
		cout << pTemp->m_nValue << " ";
			nodes.pop();//弹出
	}
	cout << endl;
}
//判断一个链表是否有环
bool LinkListHasLoop(ListNode*pHead){
	ListNode*p = pHead;
	ListNode*q = pHead;
	while (p != NULL && q != NULL)
		{
		 p = p->m_pNext;//p走一步
		 q = q->m_pNext;
		if (q != NULL)
		  q = q->m_pNext;//q走两步
		if (p != NULL && p == q)//p没有到末尾,且q追上了p说明有环
			return true;
	    }
	  return false;
}
//测试
int main(){
	ListNode* list = new ListNode();
	for (int i = 0; i < 10;i++)
	{
		addToTail(list, i);
	}
	cout << "打印链表:" << endl;
	printList(list);

	cout << "逆序打印链表:" << endl;
	printListReversingly(list);

	cout << "在末尾添加元素:10" << endl;
	addToTail(list, 10);
	printList(list);

	cout << "移除节点值为5的节点:" << endl;
	deleteNode(5, list);
	printList(list);

	cout << "找到节点值为6的节点的前驱节点:" << endl;
	ListNode* pNode=FindPrevious(6, list);
	cout << pNode->m_nValue << endl;

	cout << "删除链表:" << endl;
	deleteList(list);
	printList(list);

	cout << "链表是否为空:" << endl;
	cout << isEmpty(list) << endl;

	return 0;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值