在链表中找到第一个含有某值的节点并删除该节点的代码:
void AddToTail(ListNode** pHead,int value)//pHead是一个指向指针的指针
{
ListNode* pNew=new ListNode();
pNew->m_nValue=value;
pNew->m_pNext=NULL;
if(*pHead==NULL)
{
*pHead=pNew;
}
else
{
ListNode* pNode=*pHead;
while(pNode->m_pNext!=NULL)
pNode=pNode->m_pNext;
pNode->m_pNext=pNew;
}
}
/*
在下面的链表中找到第一个含有某值的节点并删除该节点的代码
*/
void RemoveNode(ListNode** pHead,int value)
{
if(pHead==NULL||*pHead==NULL)
return;
ListNode* pToBeDeleted=NULL;
if((*pHead)->m_nValue==value)
{
pToBeDeleted=*pHead;
*pHead=(*pHead)->m_pNext;
}
else
{
ListNode* pNode=* pHead;
while(pNode->m_pNext != NULL
&& pNode->m_pNext->m_nValue != value )
pNode = pNode->m_pNext;
if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue==value)
{
pToBeDeleted = pNode->m_pNext;
pNode->m_pNext=pNode->m_pNext->m_pNext;
}
}
if(pToBeDeleted != NULL)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
/*
往链表的末尾中添加一个节点
*/
void AddToTail(List** pHead,int value)
{
ListNode* pNew = new ListNode();
pNew->m_nValue = value;
pNew->m_pNext = NULL;
if(*phead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;
while(pNode->m_pNext != NULL)
pNode = pNode->m_pNext;
pNode->m_pNext = pNew;
}
}
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
/*
一般就是想把链表中的链接结点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了,但该方法会改变原来链表的结构
是否允许在打印链表的时候修改链表的结构?
如果不能改变链表的结构:
遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头,因为就是说第一个遍历到节点的最后一个输出,
而最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,这可以利用栈实现这种顺序。
每经过一个节点的时候,把该节点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出节点的值,
此时输出的节点的顺序已经反转过来了
*/
class Solution {
public:
vector<int> printListFromTailToHead(struct ListNode* head) {
//这里是无返回值的情况
/* if(head != NULL)
{
if(head->next != NULL)
{
printListFromTailToHead(head->next);
}
printf("%d\t",head->val);
}
}
return 1;*/
vector<int> dev;
if(head!=NULL)
{
if(head->next!=NULL)
{
dev=printListFromTailToHead(head->next);
}
dev.push_back(head->val);
}
return dev;
}
};
《剑指offer》P52