題目:輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
分析:
方法(1):更改next指針域法。當沒有節點或者只有一個結點時,直接返回這個節點;否則至少有兩個節點時,用三個指針n1,n2,n3,n1指向第一個節點,n2指向第二個節點,n3指向第三節點(可能爲空),每次修改n2的next讓其指向n1,然後利用n3保存下一個節點,然後利用n2移動n1和n2的相對位置(需要注意的是,最開始要將n1的next域置空,因爲它反轉後要做尾節點)。
ListNode* ReverseList(ListNode* pHead) {
//沒有節點,或者只有一個節點,則就返回這個節點
if (pHead == NULL || pHead->next == NULL)
return pHead;
//來到這說明至少有2個節點
ListNode* n1 = pHead;//n1指向第一個節點
ListNode* n2 = n1->next;//n2指向第二個節點
n1->next=nullptr;//反轉後第一個節點要做尾節點,因此它的next指向nullptr
ListNode* n3 = n2->next;//n3指向第三個節點(可能爲空)
while (n2 != NULL)//因爲每次修改的是n2的next指向,因此當n2爲空時,n1是頭結點
{
n2->next = n1;
n1 = n2;
n2 = n3;
if (n3 != NULL)
{
n3 = n3->next;
}
}
return n1;
}
方法(2):頭插法。讓cur指向當前結點,並且保存cur的下一個節點,創建一個新鏈表的頭指針newnode,每次將cur拿下來頭插,頭插完後將newnode指針始終要做頭,直到cur爲空,即原鏈表結點被插完,此時newnode就是新鏈表的頭。
ListNode* ReverseList(ListNode* pHead) {
//頭插法
ListNode* cur=pHead;//cur指向第一個節點
ListNode* newnode=nullptr;
while(cur)
{
ListNode* next=cur->next;//保存cur的下一個節點
cur->next=newnode;//以newnode爲新鏈表頭,將cur拿下來頭插
newnode=cur;//頭插後,newnode要始終做頭
cur=next;//移動cur到上一次保存的cur的下一個節點,繼續爲頭插做準備
}
return newnode;//當cur爲空時,說明所有節點頭插完了,此時newnode就是新鏈表的的頭
}