#include <iostream>
#include <stack>
using namespace std;
struct ListNode
{
int value;
struct ListNode* next;
};
void addToTail(ListNode** pHead,int value)
{
if(pHead == NULL) return;
ListNode* pNew = new ListNode;//建立結點
pNew->value = value;
pNew->next = NULL;
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* p = *pHead;
while(p->next != NULL)
{
p = p->next;
}
p->next = pNew;
}
}
void removeNode(ListNode**pHead, int value)
{
if(pHead == NULL || *pHead == NULL) return; //pHead 不合法或者鏈表爲空
ListNode* pToBeDelete = NULL;
if((*pHead)->value == value)
{
pToBeDelete = *pHead;
*pHead = NULL;
}
else
{
ListNode* pNode = *pHead; //pNode指向結點value的前驅 或者最後一個結點
while(pNode->next != NULL && pNode->next->value != value)
{
pNode = pNode->next;
}
if(pNode->next != NULL) //value是鏈表中的結點
{
pToBeDelete = pNode->next;
pNode->next = pToBeDelete->next;
}
}
if(pToBeDelete != NULL)
{
delete pToBeDelete;
pToBeDelete = NULL;
}
}
void printNodeReversingly(ListNode* pHead)
{
stack<ListNode*> nodes;
ListNode* pNode = pHead;
while(pNode != NULL)
{
nodes.push(pNode);
pNode = pNode->next;
}
while(!nodes.empty())
{
pNode = nodes.top();
nodes.pop();
cout<<pNode->value<<'\t';
}
cout<<endl;
}
int main()
{
ListNode* head = NULL;
addToTail(&head, 1);
addToTail(&head, 2);
addToTail(&head, 3);
addToTail(&head, 4);
printNodeReversingly(head);
removeNode(&head,4);
removeNode(&head,3);
printNodeReversingly(head);
printNodeReversingly(NULL);
return 0;
}
《劍指offer》鏈表的結點的插入刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.