【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表

来源:互联网 发布:中国股市知乎 编辑:程序博客网 时间:2024/06/02 04:40

删除一个无头单链表的非尾节点

分析:最直观的思路,删除一个节点,需要知道该节点的前一个节点,然后将该节点的前一个节点指向该节点的下一个节点。
思路:可将删除的节点的下一个节点 覆盖掉当前要删除的点,然后原删除的节点指向下一个节点的下一个节点。

//确保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 << " ";    }}
阅读全文
0 0