1、删除一个无头单链表的非尾节点:
分析:既然是一个无头链表,那么我们就不能通过直接访问这种形式进行删除。找不到上一个,那么就找下一个,让tmp保存node后节点的信息,然后让改动node的值,让node指向tmp的下一个,此时删除tmp,也顺利完成题目的要求。
void DelNoHeadNotTail(PNode* pHead , int pos)
{
if(NULL != pHead)
{
PNode* pPrev = pHead;//pPrev指向要删除结点的前一个结点
PNode* pCur = pPrev->_pNext ;//pCur指向要删除节点
while(pCur->_data != pos)
{
pCur = pCur->_pNext ;
pPrev = pPrev->_pNext ;
}
pPrev->_pNext = pCur->_pNext ;
free(pCur);
pCur->_pNext = NULL;
}
}
2、从尾到头打印单链表
从头到尾比较简单,那么从尾到头即第一个遍历的节点最后一个输出,而最后一个遍历的节点第一个输出,即“先进后出”,可以使用栈来实现这个顺序。每经过一个节点把该节点放到一个栈中,当遍历完整个链表后再从栈顶开始 逐个输出节点的值,此时输出的节点顺序就反转过来了。当然这里我使用的C语言实现所以我们可以用递归来模拟整个过程。
void PrintFromTail2Head(PNode pHead)
{
if(pHead != NULL)
{
if(pHead->_pNext != NULL)
PrintFromTail2Head(pHead->_pNext );
}
printf("%d->",pHead->_data );
}
注意:(逆置)反转链表和逆序打印链表是两个问题。
上面所述为逆序打印链表,接下来我们讨论反转链表这回事。
反转链表是将该节点原来指向下一个节点的指针指向该节点的前一个节点,最后得到的新链表的头节点指向原链表的最后一个节点。那么反转一个链表就只需要调整链表中指针的方向。
Node* ReverseList(PNode pHead)
{
PNode pReverseHead = NULL;
PNode pNode = pHead;
PNode pPrev = NULL;
while(pNode != NULL)
{
PNode pNext = pNode->_pNext ;
if(pNext == NULL)
pReverseHead = pNode;
pNode->_pNext = pPrev;
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}