【基礎題】
1.刪除一個無頭單鏈表的非尾節點
2.從尾到頭打印單鏈表
首先,給出節點信息
#include <iostream>
#include <cassert>
typedef int DataType;
typedef struct ListNode
{
DataType _val;
ListNode* _pNext;
}Node, *PNode;
1.刪除一個無頭單鏈表的非尾節點
思路:
這道題目,刪除節點容易,但是難就難在如何連接刪除之後分成兩部分的鏈表。
本人思考除了兩種節解法。
1,如果用三個指針的話,一個指向刪除節點的前驅,一個指向刪除節點,一個指向刪除節點的後繼。
2,第二種辦法,刪除節點將它的後繼節點的值拷貝到自己,然後刪除後繼節點。效果是一樣的。
//這裏採用第二種方法
void Delete_Not_Tail_Node(PNode pos) //參數表示的是本該刪除的那個非尾節點
{
assert(NULL != pos); //既然刪除某個節點,就不能爲NULL
if (NULL == pos->_pNext) //pos是尾節點
return;
PNode pDelete = pos->_pNext; //將要刪除的後繼節點
pos->_val = pDelete->_val; //取得數據
pos->_pNext = pDelete->_pNext; //跳過後繼節點,指向後繼的後繼
delete pDelete;
pDelete = NULL;
}
2.從尾到頭打印單鏈表
思路:
1,利用遞歸的特性,從後往前返回遍歷的內容。
2,利用棧存儲每次遍歷的值,然後出棧。
//這裏採用遞歸實現
void Print_List_From_Tail_To_Head(PNode pHead)
{
if (NULL == pHead)
return;
Print_List_From_Tail_To_Head(pHead->_pNext);
std::cout << pHead->_val << " ";
}