原題鏈接:https://leetcode.cn/problems/reverse-linked-list/description/
目錄
1. 題目描述
2. 思路分析
3. 代碼實現
1. 題目描述
2. 思路分析
方法一:三指針翻轉法
使用三個結構體指針n1,n2,n3,原地修改結點指向。
就是讓n1先指向空指針NULL,n2指向頭結點,n3指向頭結點下一個結點。
用n2進行遍歷。然后讓n1指向n2,n2指向n3,n3指向n3的下一個結點。如此循環遍歷,直到n2指向空指針NULL時停止。
最后返回n1即可。
?
這里為什么要用三個指針呢?
因為如果只用兩個指針,那么我們讓n1指向n2后,鏈表的連接就斷了,找不到原鏈表n2的下一個結點了。
同時,我們需要注意一些臨界條件和特殊情況。
比如鏈表是空的,我們就讓最后返回空即可。
一般情況至少有一個結點存在,所以我們得在n2不為空的情況下(即if(n2)),讓n3指向n2的下一個結點。(n3=n2->next)
遍歷過程中,n3要指向下一個結點,那么n3就不能是空指針(即if(n3) n3=n3->next)
方法二:頭插法
對每一個結點都進行頭插
3. 代碼實現
方法一:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* reverseList(struct ListNode* head){struct ListNode *n1,*n2,*n3;n1=NULL;n2=head;if(n2)n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}
?
方法二:
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* reverseList(struct ListNode* head){struct ListNode *cur=head;struct ListNode *newhead=NULL;while(cur){struct ListNode *next=cur->next;//頭插cur->next=newhead;newhead=cur;cur=next;}return newhead;
}
?