1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
2017-07-26 08:26
369 查看
从尾到头打印单链表
1.将所有节点压如栈中,利用栈的先进后出原则来实现
2.也可以用递归来实现
删除一个无头单链表的非尾节点
因为是单链表无法知道删除节点的前一节点是什么,当然可以遍历一次,用指针堆前一节点标记,但是这个时间复杂度就高了,我们可以利用下图的方法来实现
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/28/f8ad29ddc52812cfdb0b3fc2c6f2a97e)
这样就实现了无头单链表的非尾节点的删除
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; } }
相关文章推荐
- 【链表】删除一个无头单链表的非尾节点 以及从尾到头打印单链表
- day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制
- C语言:【单链表】删除一个无头单链表的非尾节点
- 1.删除一个无头单链表的非尾节点 2.从尾到头打印单链表
- 判断链表相交,删除无头单链表的非尾节点及倒序打印单链表——题集(四)
- 链表--删除一个无头单链表的非尾节点
- 每日一题——删除无头链表的非尾节点、逆向打印单链表
- 删除一个无头单链表的非尾节点+从尾到头打印单链表
- C语言:【单链表】删除一个无头单链表的非尾节点
- 17_7_17:删除一个无头单链表的非尾节点。从尾到头打印单链表
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 【链表面试题】删除无头单链表的非尾节点,插入一个元素到无头链表指定位置
- 笔试/面试:删除一个无头单链表的非尾节点 ,从尾到头打印单链表
- 链表面试题(一)---删除一个无头单链表的非尾结点
- 删除一个无头单链表的非尾节点(C语言)
- 删除一个无头单链表的非尾节点
- <笔试><面试>单链表相关(1)从尾到头打印链表、删除一个无头链表的非尾结点
- 删除一个无头单链表的非尾节点
- 删除一个无头单链表的非尾节点
- 删除一个无头单链表的非尾节点【每日一题】