1删除一个无头单链表的非尾结点2,从尾到头打印单链表。
首先来分析第二个问题,首先要确定的是需要遍历链表,遍历的顺序是从头到尾的顺序,可输出的顺序是从却是从尾到头,也就是说第一个遍历的节点最后一个输出,而最后一个遍历的节点却是第一个输出,这就是“后进先出”,我们可以用栈来实现这种顺序。每进过一个节点的时候,把该节点放到第一个栈中。当遍历完整个链表之后,再从栈顶开始逐个输出节点的值,此时输出的节点顺序已经反过来了。实现的代码为:
void PLReve(ListNode* pHead) { stack<ListNode*> nodes; ListNode* pNode = pHead; while (pNode!=NULL) { node.push(pNode); pNode = pNode->m_pNext; } while (!nodes.empty()) { pNode = pNode.top(); printf("%d\t", pNode->m_nValue); nodes.pop; } }
上面是以栈的方式实现,除此之外还有递归的方式,要实现反过来输出链表,我们每访问到一个节点的时候,先递归输出它后面的节点,在输出该节点自身。代码为:如何删除一个无头单链表:void PLReve(ListNode* pHead) { if (pHead != NULL) { if (pHead->m_pNext != NULL) { void PLReve(pHead->m_pNext); } printf("%d\t", pNode->m_nValue); } }
void Deletail(ListNode* pos) { if (pos->next) { pos->data = pos->next->data; ListNode *tmp = pos->next; pos->next = tmp->next; free(tmp); tmp = NULL; } }