day05刪除一個無頭單鏈表的非尾節點 +從尾到頭打印單鏈表+複雜鏈表的複製

  • 1.刪除一個無頭單鏈表的非尾節點,時間複雜度爲O(1)
struct ListNode
{
    int val;
    ListNode *next;

    ListNode(int x):val(x),next(NULL) { }
};
//節點的後一個節點賦值給要刪除的節點,再刪除這個後面的節點。
int DelNotTail(ListNode *delnode)
{
    if(delnode == NULL)
        return -1;

    ListNode *pnext = delnode->next;
    delnode->val = pnext->val;
    delnode->next = pnext->next;
    delete pnext;

    return 0;

  • 從尾到頭打印單鏈表
struct ListNode
{
    int val;
    ListNode *next;

    ListNode(int x):val(x),next(NULL) { }
};

void Print(ListNode *phead)
{
    if(phead == NULL)
        return ;
    Print(phead->next);
    cout << phead->val <<endl;
}
  • 複雜鏈表的複製

一個鏈表的每個節點,有一個指向next指針指向下一個節點,還有一個random指針指向這個鏈表中的一個隨機節點或者NULL,現在要求實現複製這個鏈表,返回複製後的新鏈表。

struct RandomListNode {
    int label;
    struct RandomListNode *next, *random;
    RandomListNode(int x) :
        label(x), next(NULL), random(NULL) {
        }
};


RandomListNode* Clone(RandomListNode* pHead)
{
    if(pHead == NULL)
        return NULL;
    //第一步:每一個節點的後面插入一個新的節點
    RandomListNode *pcur = pHead;

    while(pcur)
    {
        RandomListNode *pm = new RandomListNode(pcur->label);
        pm->next = pcur->next;
        pcur->next = pm;

        pcur = pm->next;
    }

    //第二步:爲每一個新節點的隨機指針賦值
    pcur = pHead;
    while(pcur)
    {
        RandomListNode *pnext = pcur->next;  //指向新的節點

        if(pcur->random == NULL)
            pnext->random = NULL;
        else
            pnext->random = pcur->random->next;

        pcur = pnext->next;
    }

    //第三步:將新的鏈表拆下來
    RandomListNode *ph = pHead->next;
    RandomListNode *pold = pHead;
    RandomListNode *pnew = ph;

    while(pnew)
    {
        pold->next = pnew->next;
        pold = pnew->next; //當pnew指向最後一個節點時,此時pold指向空了,
        pnew->next = (pold == NULL? NULL:pold->next);
        pnew =  (pold == NULL? NULL:pold->next);
    }

    return ph;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章