删除一个无头单链表的非尾节点
分析:最直观的思路,删除一个节点,需要知道该节点的前一个节点,然后将该节点的前一个节点指向该节点的下一个节点。
思路:可将删除的节点的下一个节点 覆盖掉当前要删除的点,然后原删除的节点指向下一个节点的下一个节点。
//确保posNode不是尾节点
void DelNotTailNode(Node *posNode)
{
if (posNode)
{
Node* pNext = posNode->_next;
posNode->_value = pNext->_value;
posNode->_next = pNext->_next;
free(pNext);
pNext = NULL;
}
}
从尾到头打印单链表
方法1、
借助栈的后进先出的特性,将从头到尾遍历的节点保留,然后输出栈。
void PrintListReverse(Node* pHead)
{
std::stack<Node *> s;
Node* pNode = pHead;
while (pNode)
{
s.push(pNode);
pNode = pNode->_next;
}
//输出栈
while (!s.empty())
{
cout << s.top()->_value << " ";
s.pop();
}
cout << endl;
}
方法2
方法1借助栈,递归的本质就是栈,所以可以用递归实现,每次访问到一个节点的时候想,先递归输出它的后面的节点,再输出该节点自身。
void PrintListReverse2(Node* pHead)
{
if (pHead != NULL)
{
PrintListReverse2(pHead->_next);
cout << pHead->_value << " ";
}
}