【数据结构】链表复习--利用C++复写单链表

  1. 利用输入构造链表?
    while(cin>>val)
    if(cin.get()=='\n')
  2. 清空链表?
    从头到尾清空
  3. 在位置x处前插节点?
    需要获取位置x的前一个节点指针
  4. 删除节点?
    要获取待删除节点的前一个节点指针
  5. 反转链表?
    https://www.cnblogs.com/byrhuangqiang/p/4311336.html
  6. 反向打印链表可以使用stack结构
#include <iostream>
using namespace std;

typedef struct ListNode
{
	int m_val;
	ListNode* m_pNext;
	ListNode(int _val = 0) :m_val(_val), m_pNext(nullptr) {};
}*PListHead,*PCurNode;

PListHead CreatList();
void Traverse(PListHead l);
void InsertNode(PListHead l, int val, int pos = 1);//前插,默认最前面
void DeleteNode(PListHead l, int val);//删除第一个val节点
bool IsFind(PListHead l, int val);
PCurNode GetPreNode(PListHead l, int val);
void ReverseList(PListHead l);
void PrintReverseList(PListHead list)
int main()
{
	PListHead pHead = CreatList();
	Traverse(pHead);
	InsertNode(pHead, 10);
	Traverse(pHead);
	InsertNode(pHead, 20, 2);
	Traverse(pHead);
	cout << "删除节点10:" << endl;
	DeleteNode(pHead, 10);
	Traverse(pHead);
	cout << "反转链表" << endl;
	ReverseList(pHead);
	Traverse(pHead);
	system("pause");
	return 0;
}

PListHead CreatList()
{
	PListHead head = new ListNode;
	PCurNode traNode = head;
	int val = 0;
	cout << "Input data(Enter to quit) to creat List:" << endl;
	while (cin >> val)
	{
		PCurNode node = new ListNode;
		node->m_val = val;
		node->m_pNext = nullptr;
		traNode->m_pNext = node;
		traNode = node;
		if(cin.get() == '\n')
			break;
	}
	return head;
}

void Traverse(PListHead l)
{
	PCurNode traNode = l->m_pNext;
	while (traNode != nullptr)
	{
		cout << traNode->m_val << " ";
		traNode = traNode->m_pNext;
	}
	cout << endl;
}


void InsertNode(PListHead l, int val, int pos)
{
	PCurNode cur = l->m_pNext;
	PCurNode pre = l;
	for (int i = 1; i < pos; i++)
	{
		pre = cur;
		cur = cur->m_pNext;
	}
	PCurNode newNode = new ListNode;
	newNode->m_val = val;
	newNode->m_pNext = nullptr;
	pre->m_pNext = newNode;
	newNode->m_pNext = cur;
}

void DeleteNode(PListHead l, int val)
{
	if (!IsFind(l, val))
	{
		cout << "没有找到要删除的节点" << endl;
	}
	PCurNode pre = GetPreNode(l, val);
	PCurNode cur = pre->m_pNext;
	PCurNode next = cur->m_pNext;
	pre->m_pNext = next;
	delete cur;
}

bool IsFind(PListHead l, int val)
{
	PCurNode tra = l->m_pNext;
	while (tra)
	{
		if (tra->m_val == val)
			return true;
	}
	return false;
}

PCurNode GetPreNode(PListHead l, int val)
{
	if (!IsFind(l, val))
	{
		cout << "没有该节点" << endl;
	}
	PCurNode traNode = l;
	PCurNode pre = l;
	while (traNode->m_pNext)
	{
		if (traNode->m_pNext->m_val == val)
		{
			pre = traNode;
		}
		traNode = traNode->m_pNext;
	}
	return pre;
}

void ReverseList(PListHead l)
{
	if (l == nullptr || l->m_pNext == nullptr)
		return;
	PCurNode head = l;
	PCurNode cur = head->m_pNext->m_pNext;
	PCurNode pre = head->m_pNext;
	while (cur)
	{
		pre->m_pNext = cur->m_pNext;
		cur->m_pNext = head->m_pNext;
		head->m_pNext = cur;
		cur = pre->m_pNext;
	}
	l = head;
}

void PrintReverseList(PListHead list)
{
	if (list == nullptr || list->m_pNext == nullptr)
		return;
	stack<ListNode* > nodes;
	PCurNode traNode = list->m_pNext;
	while (traNode != nullptr)
	{
		nodes.push(traNode);
		traNode = traNode->m_pNext;
	}
	while (!nodes.empty())
	{
		traNode = nodes.top();
		nodes.pop();
		cout << traNode->m_value << " ";
	}
	cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值