1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表

从尾到头打印单链表
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值