链表的使用以及链表逆序,链表倒置反转

本文探讨了链表的基本使用,并深入讲解了如何实现链表的逆序和倒置反转操作,通过实例解析关键步骤,帮助理解链表数据结构的操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"
#include <string>
#include <iostream>
#include <Windows.h>
using namespace std;
class LinkNode
{
public:
	int nID;
	string name;
	LinkNode* pNext;
};

class LinkList
{
public:
	int size;
	LinkNode* head;
};

void initList(LinkList* list)
{
	int nCount = 0;
	cout << "请输入学生个数" << endl;
	cin >> nCount;
	//LinkList* list = new LinkList();
	list->size = 0;
	//头结点不保存数据
	list->head = new LinkNode();
	list->head->pNext = nullptr;
	//新建一个指向尾部的指针,赋值(指向)头结点
	LinkNode* tailPtrNode = list->head;
	for (int i = 0; i < nCount; i++)
	{
		//new一个节点
		LinkNode* studentNode = new LinkNode();
		//将tail(head)的next指向要插入的节点,此时head的next也指向了要插入的这个节点,链接成功
		tailPtrNode->pNext = studentNode;
		//将这个新插入的节点的next置为nullptr
		studentNode->pNext = nullptr;
		cout << "请输入学生ID  姓名" << endl;
		cin >> studentNode->nID >> studentNode->name;
		//把这个新插入的节点赋值(指向)给tail 
		//实际上是	tailPtrNode = studentNode;
		tailPtrNode = tailPtrNode->pNext;

		//list长度加一
		list->size++;
	}
}
void showList(LinkList* list)
{
	//遍历
	LinkNode* curPtrNode = list->head;
	while (curPtrNode->pNext != nullptr)
	{
		curPtrNode = curPtrNode->pNext;
		cout << "学号:";
		cout << curPtrNode->nID << "\t";
		cout << "姓名:";
		cout << curPtrNode->name << endl;
	}
}
LinkNode* getNodeByID(LinkList* list, int nID)//通过位置获取
{
	if (list->head->pNext == nullptr)
	{
		return nullptr;
	}
	if (nID>list->size || nID<0)
	{
		return nullptr;
	}
	if (nID == 0)
	{
		return list->head;
	}
	int nCount = 0;
	LinkNode* curPtrNode = list->head;
	while (curPtrNode->pNext != nullptr)
	{
		curPtrNode = curPtrNode->pNext;
		nCount++;
		if (nID == nCount)
		{
			return curPtrNode;
		}
	}
}
void insertNode(LinkList* list, int nPost)//通过位置插入
{
	if (list->head->pNext == nullptr)
	{
		return;
	}
	if (nPost > list->size || nPost <= 0)
	{
		return;
	}
	LinkNode* curPtrNode = getNodeByID(list, nPost - 1);
	LinkNode* insertNode = new LinkNode();
	cin >> insertNode->nID >> insertNode->name;
	insertNode->pNext = curPtrNode->pNext;
	curPtrNode->pNext = insertNode;
}
void addNode(LinkList* list)//尾部添加一个学生
{
	if (list->head->pNext == nullptr)
	{
		return;
	}
	cout << "请输入要添加学生的ID,姓名" << endl;
	LinkNode* studentNode = new LinkNode();
	cin >> studentNode->nID >> studentNode->name;

	LinkNode* curPtrNode = list->head;
	while (curPtrNode->pNext != nullptr)
	{
		curPtrNode = curPtrNode->pNext;
	}
	curPtrNode->pNext = studentNode;
	studentNode->pNext = nullptr;
}
void deleteNode(LinkList* list, int nPost)//通过位置删除
{
	if (list->head->pNext == nullptr)
	{
		return;
	}
	if (nPost > list->size || nPost <= 0)
	{
		return;
	}

	LinkNode* curPtrNode = getNodeByID(list, nPost - 1);
	LinkNode* deleteNode = curPtrNode->pNext;
	curPtrNode->pNext = curPtrNode->pNext->pNext;
	if (deleteNode)
	{
		delete(deleteNode);
	}
	//delete(deleteNode);
}
void reverse(LinkList* list)
{
	if (list->head->pNext == nullptr)
	{
		return;
	}
	LinkNode* p=list->head;
	LinkNode* q = nullptr;
	LinkNode* r = nullptr;
	p = p->pNext;
	if (p->pNext == nullptr)
	{
		return;
	}
	q = p->pNext;
	if (q->pNext == nullptr)
	{
		p->pNext = nullptr;
		q->pNext = p;
		list->head->pNext = q;
		return;
	}
	r = q->pNext;
	if (r->pNext == nullptr)
	{
		p->pNext = nullptr;
		q->pNext = p;
		r->pNext = q;
		list->head->pNext = r;
		return;
	}
	else if (r->pNext != nullptr)
	{
		p->pNext = nullptr;
		q->pNext = p;
		p = q;
		q = r;
		r = r->pNext;
		while (r->pNext != nullptr)
		{
			//	p = p->pNext;
			//	q = p->pNext;
			//	r = q->pNext;
			q->pNext = p;
			p = q;
			q = r;
			r = r->pNext;
		}
		q->pNext = p;
		r->pNext = q;
		list->head->pNext = r;
	}
	
}
int _tmain(int argc, _TCHAR* argv[])
{
	int nPost = 0;
	LinkList* list = new LinkList();
	initList(list);
	showList(list);

	//addNode(list);//尾部添加一个学生
	//showList(list);

	//cout << "输入要插入的学生位置,id,姓名(要插入的位置不能大于学生个数)" << endl;
	//cin >> nPost;
	//insertNode(list, nPost);
	//showList(list);
	//cout << "输入要删除的学生位置(要删除的位置不能大于学生个数)" << endl;
	//cin >> nPost;
	//deleteNode(list, nPost);
	cout << "反转后" << endl;
	reverse(list);
	showList(list);
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值