反轉連結串列
反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?
思路迭代(麻煩版)
struct ListNode* reverseList(struct ListNode* head) { struct ListNode* temp=head; struct ListNode* c=head; struct ListNode* reverse=head; if(head==NULL){ return NULL; } int count=1; while(c->next!=NULL){ count++; c=c->next; } int i=0; int a[count]; while(temp!=NULL){ a[i]=temp->val; i++; temp=temp->next; } for(int j=count-1;j>=0;--j){ reverse->val=a[j]; reverse=reverse->next; } return head; }
思路迭代(簡潔)
1->2反轉該連結串列,1的下一節點應指向NULL,事先需要用temp先儲存2,這時新頭節點newHead為1,下一迴圈,然後針對節點2做同樣操作,2的下一節點為NULL,接著設為節點1
struct ListNode* reverseList(struct ListNode* head) { struct ListNode* node=head; struct ListNode* newHead=NULL; struct ListNode* temp=NULL; while(node!=NULL){ temp=node->next; node->next=newHead; newHead=node; node=temp; } return newHead; }
遞迴
先反轉後面的連結串列,從最後面的兩個結點開始反轉,依次向前,將後一個連結串列結點指向前一個結點,注意每次反轉後要將原連結串列中前一個結點的指標域置空
struct ListNode* reverseList(struct ListNode* head) { //如果連結串列為空或者連結串列中只有一個元素 if(head==NULL||head->next==NULL){ return head; } //先反轉後面的連結串列,直到連結串列的末端結點 struct ListNode* temp=reverseList(head->next); //再將當前節點設定為後面節點的後續節點 head->next->next=head; head->next=NULL; return temp; }