1. 程式人生 > >翻轉連結串列的方法

翻轉連結串列的方法

前兩天看到一個題目,將連結串列反轉,我的第一思路是將列表放入棧中,然後再依次拿出來。

思想過於簡單,我想到說利用陣列來實現這個功能。之後檢視網上各種大神的方法,做以下幾個方法總結。

一、放入陣列,陣列倒置

void reverse(pnode head, int count)//把連結串列的節點值放在陣列中,倒置陣列
{
    int a[5]= {0};
 
    for(int i=0; i<count,head->pnext!=NULL; i++)
    {
        a[i]=head->pnext->data;
        head=head->pnext;
 
    }
    
for(int j=0,i=count-1; j<count; j++,i--) printf("%d\t",a[i]); }

二、遍歷到連結串列的最後一個節點,將最後一個節點插入頭節點的後面,接著迴圈進行插入,直到只剩下一個節點為止

void ReserveList(pListNode pHead)
{
    pListNode p = pHead;
    pListNode pPre = pHead;
    pListNode pTail = pHead->next;
    while (p->next->next != NULL)
    {
        
while (pTail->next) { pPre = pTail; pTail = pTail->next; } pPre->next = NULL; pTail->next = p->next; p->next = pTail; p = pTail; } }

三、首先定義三個指分別 Pre(表示當前指標的前驅初值為NULL),pCur(當前節點指標),pNext(當前節點的下一個指標),每當當前指標不為空時就會把當前指標指向前驅指標,直到當前指標為空。

void ReserveList(pListNode pHead)
{
    pListNode pre = NULL;
    pListNode pNext = NULL;
    pListNode pCur = pHead->next;
    while (pCur)
    {
        pNext = pCur->next;
        pCur->next = pre;
        pre = pCur;
        pCur = pNext;
    }
    pHead->next = pre;
}

四、遞迴:當求全部連結串列的翻轉時,只要把除當前指標外後面的指標翻轉,然後再把當前指標放在翻轉後的指標後面就行了,即把連結串列從更大範圍翻轉縮小更小範圍

pListNode ReserveList(pListNode  p, pListNode pStaticHead)
{   
    if (pStaticHead == NULL)
    {
        return NULL;
    }
    if (p->next == NULL)
    {
        pStaticHead->next = p;
        return p;
    }
    else
    {
        pListNode temp = ReserveList(p->next,pStaticHead);
        temp->next = p;
        p->next = NULL;
        return p;
    }
}

參考:

https://blog.csdn.net/qq_36675830/article/details/78064488?readlog

https://blog.csdn.net/qq_36675830/article/details/78064488?readlog