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

来源:互联网 发布:中标麒麟安装软件 编辑:程序博客网 时间:2024/05/29 19:47
#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;   //将要删除的节点赋给 delNodehead->_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
原创粉丝点击