单向链表的定义如下:
struct ListNode{
int m_nValue;
ListNode* m_pNext;
}
往该链表的末尾添加一个结点的C++代码如下:
ListNode *AddTail(ListNode** pHead,int value){
if(pHead==NULL) return NULL;
ListNode *pNew=new ListNode();
pNew->m_nValue=value;
pNew->m_pNext=NULL;
if(*pHead==NULL) return *pHead=pNew;
ListNode *pNode=(*pHead);
while(pNode->m_pNext!=NULL){
pNode=pNode->m_pNext;
}
pNode->m_pNext=pNew;
return *pHead;
}
在链表中找到第一个含有某值的结点并删除该结点:
void RemoveNode(ListNode **pHead,int value){
if(pHead==NULL||(*pHead)==NULL) return;
ListNode *pToBeDeleted=*NULL;
ListNode *p=*pHead;
if((*pHead)->m_nValue==value){
pToBdeDeleted = *pHead;
*pHead=(*pHead)->m_pNext;
}
while(p->m_pNext!=NULL){
if(p->m_pNext->m_Value!=value){
p=p->m_pNext;
}
else{
pToBeDeleted=p->m_pNext;
p->m_pNext=p->m_pNext->m_pNext;
}
}
if(pToBeDeleted!=NULL){
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
从头到尾打印链表
题目:输入一个链表的头结点,从尾到头反过来打印每个结点的值
思想:用一个栈,可以实现先进后出
void PrintListReverse(ListNode* pHead){
std::stack<ListNode*> nodes;
ListNode* pNode = pHead;
while(pNode!=NULL){
nodes.push(pNode);
pNode=pNode->m_pNext;
}
while(!nodes.empty()){
pNode=nodes.top();
printf("%d\t",pNode->m_nValue);
nodes.pop();
}
}