关于单链表的尾插,删除,反向打印单链表

#include <iostream>
using namespace std;

#include <stack>

struct ListNode
{
	int _value;
	ListNode* _next;
};

void AddToTail(ListNode** pHead, int value)
{
	ListNode* pNew = new ListNode();
	pNew->_value = value;
	pNew->_next = NULL;

	if (NULL == *pHead)
	{
		*pHead = pNew;
	}
	else
	{
		ListNode* head = *pHead;
		while (head->_next!=NULL)
		{
			head = head->_next;
		}
		head->_next = pNew;
	}

}

void Remove(ListNode** pHead, int value)
{
	if (NULL == pHead || NULL == *pHead)//安全检查
	{
		return;
	}

	ListNode* head = *pHead;//最好不要使用参数直接进行逻辑运算

	ListNode* delNode = NULL;//要删除的节点


	if (value == head->_value)//要删除的节点为头结点
	{
		delNode = head;
		head = head->_next;
		*pHead = head;  //必须有这一步,不然到下一次删除会找不到头结点///

	}
	else
	{
		while ((head->_next != NULL) && (head->_next->_value != value))  //要删除的节点为非头结点
		{
			head = head->_next;
		}

		if ((head->_next != NULL) && (head->_next->_value) == value)//找到_value与value 相同的节点的前一个节点
		{
			delNode = head->_next;   //将要删除的节点赋给 delNode
			head->_next = head->_next->_next;//将要删除的节点的前一个节点指向要删除的节点的后一个节点
		}
	}
	if (delNode != NULL)//判断是否找到_value==value的节点,delNode为空则没有找到,否则找到了,删除它
	{
		delete delNode;
		delNode = NULL;//置空指针,防止错误访问到野指针
	}
}

void ReversePrintList(ListNode* pHead)//从尾到头打印单链表,是一个"后进先出的特点",所以可以先把所有的节点push进栈中
{
	if (NULL == pHead)
	{
		return;
	}

	ListNode* pNode = pHead;

	stack<ListNode*> s;

	while (NULL != pNode->_next)
	{
		s.push(pNode);
		pNode = pNode->_next;
	}

	while (!s.empty())
	{
		cout << s.top()->_value<<" ";
		s.pop();
	}
	cout << endl;
}

void Test()
{
	ListNode* pHead = NULL;
	ReversePrintList(pHead);
	AddToTail(&pHead, 1);
	AddToTail(&pHead, 2);
	AddToTail(&pHead, 3);
	AddToTail(&pHead, 4);
	AddToTail(&pHead, 5);
	AddToTail(&pHead, 6);
	AddToTail(&pHead, 7);
	AddToTail(&pHead, 8);
	AddToTail(&pHead, 9);
	AddToTail(&pHead, 10);
	Remove(&pHead, 1);
	Remove(&pHead, 2);
	Remove(&pHead, 3);
	Remove(&pHead, 4);
	Remove(&pHead, 5);
	Remove(&pHead, 6);
	Remove(&pHead, 7);
	Remove(&pHead, 8);
	Remove(&pHead, 9);


	Remove(&pHead, 10);
	Remove(&pHead, 5);
	Remove(&pHead, 100);
	ReversePrintList(pHead);

}

int main()
{
	
	Test();
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值