17_7_17:刪除一個無頭單鏈表的非尾節點。從尾到頭打印單鏈表

【基礎題】
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 << " ";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章