从尾到头打印单链表
1.将所有节点压如栈中,利用栈的先进后出原则来实现
2.也可以用递归来实现
struct ListNode
{
int _value;
ListNode* _pNext;
};
void ReversePrintfList(ListNode* pHead)
{
std::stack<ListNode*> sNode;
ListNode* pNode = pHead;
while(pNode)
{
sNode.push(pNode);
pNode=pNode->_pNext;
}
while(!sNode.empty())
{
pNode = sNode.top();
printf("%d ",pNode->_value);
sNode.pop();
}
printf("\n");
};
//递归实现
void ReversePrintfList(ListNode * pHead)
{
if(NULL != pHead)
{
if(NULL != pHead->_pNext)
ReversePrintfList(pHead->_pNext);
printf("%d ", pHead->_value);
}
}
删除一个无头单链表的非尾节点
因为是单链表无法知道删除节点的前一节点是什么,当然可以遍历一次,用指针堆前一节点标记,但是这个时间复杂度就高了,我们可以利用下图的方法来实现
这样就实现了无头单链表的非尾节点的删除
void DeleteNoHeadListNode(ListNode* pNode)
{
assert(pNode);
if(NULL == pNode->_pNext)
{
delete pNode;
pNode = NULL;
}
else
{
ListNode* pNodeNext = pNode->_pNext;
pNode->_value = pNodeNext->_value;
pNode->_pNext = pNodeNext->_pNext;
delete pNodeNext;
pNodeNext = NULL;
}
}