饭后一算法,活到九十九
算法(一) 链表练习
1.在链表的末尾添加一个结点
void addnode(ListNode **pHead, int value)
{
ListNode *pNew=null;
pNew->m_nvalue=value;
pNew->m_nNext=null;
if(*pHead==null)
*pHead=pNew;
else
{
ListNode *pNode=*pHead;
while(pNode->m_nNext !=null)
pNode=pNode->m_nNext;
pNode->m_nNext=pNew;
}
}
2.删除值为value的结点
void DeleteNode(ListNode **pHead,int value)
{
if(pHead==null || *pHead==null)
return;
ListNode *pToDeleted=null;
if(*pHead->value==value)
{
pToDeleted=*pHead;
*pHead=*pHead->m_nNext;
}
else
{
ListNode *pNode=*pHead;
while(pNode->m_nNext!=null&&pNode->m_nNext->m_nvalue!=value)
pNode=pNode->m_nNext;
if(pNode->m_nNext!=null&&pNode->m_nNext->m_nvalue==value)
{
pToDeleted=pNode->m_nNext;
pNode->m_nNext=pNode->m_nNext->m_nNext;
}
}
if(pToDeleted!=null)
{
delete pToDeleted;
pToDeleted=null;
}
}
3.链表倒叙输出(栈解法)
void listReverPrint(ListNode *pHead)
{
if(pHead==null)
return;
std::stack<ListNode *> nodes;
ListNode *pNode=pHead;
while(pNode!=null)
{
nodes.push(pNode);
pNode=pNdoe->m_nNext;
}
while(!nodes.empty())
{
pNode=nodes.top();
print("%d\t",pNode->value);
nodes.pop();
}
}
递归解法
void listReverPrint(ListNode *pHead)
{
if(pHead!=null)
{
if(pHead->m_nNext!=null)
{
listReverPrint(pHead->m_nNext);
}
print("%d\t",pHead->m_nvalue);
}
}
打印倒数第n个节点
想法:用两个指针都指向头指针,R指针先向后移动n个结点。后两个节点同时向后移动,当R结点移动到末尾时,L结点就会移动到倒数第n个结点位置。
void printlist(ListNode *pHead,int n)
{
if(pHead==null)
return;
int i;
ListNode *pNodeL=pHead;
ListNode *pNodeR=pHead;
for(i=0;i<n;i++)
{
if(pNodeR->m_nNext!=null)
{
pNodeR=pNodeR->m_nNext;
}
}
if(i==n)
{
while(pHeadR->m_nNode!=null)
{
pHeadL=pHeadL->m_nNext;
pHeadR=pHeadR->m_nNext;
}
print("%d",pHeadL->m_nvalue);
}
else
{
print("%s","链表不足n个");
}
}