反轉一個單鏈表。
示例:
輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL
進階:
你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題?
解析:
方法一:
因為反轉鏈表頭節點會發生變化,定義兩個指針p,q,p指針和head指針同步后移,p向前給head掛鏈。q指針的位置不變,改變的是它的next節點,不斷地掛p的next節點直至最后q指向NULL成為最后一個節點。這個方法會耗費很長時間。
迭代:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if( head == NULL || head->next == NULL ) return head;
struct ListNode *q=NULL;
struct ListNode *p=NULL;
q=head;//q不動
p=head->next;
while(p){
q->next=p->next;
p->next=head;
head=p;
p=q->next;
}
return head;
}
方法二:
遞歸的解法,思路是不斷進入遞歸函數,直到head指向最后一個節點,遞歸到底,最后一個節點會根據非空條件直接返回至倒數第二個節點,然后進行操作,反向掛鏈,掛NULL,最后返回p,返回上一層。
第一次 return p
進行操作
struct ListNode* reverseList(struct ListNode* head) {
if( head == NULL || head->next == NULL ) return head;
struct ListNode* p = reverseList(head->next);
head -> next -> next = head;
head -> next = NULL;
return p;
}
中間過程輸出