刷題206. Reverse Linked List

一、題目說明

題目206. Reverse Linked List,翻轉一個鏈表。難度是Easy!可以遞歸,也可以非遞歸。

二、我的解答

翻轉,這個確實不難,非遞歸算法:

class Solution{
	public:
		ListNode* reverseList(ListNode* head){
			if(head == NULL || head->next==NULL) return head;
			ListNode *cur,*p = head->next;
			bool first = true;
			while(p !=NULL && p->next!=NULL){
				cur = p->next;
				
				p->next = head;
				if(first){
					head->next = NULL;
					first = false;
				}
				
				head = p;
				p = cur;
			}
			if(p !=NULL){
				p->next = head;
				if(first){
					head->next = NULL;
					first = false;
				}
				head = p;
			}
			
			return head;
		}
};

性能如下:

Runtime: 8 ms, faster than 88.11% of C++ online submissions for Reverse Linked List.
Memory Usage: 9.7 MB, less than 5.34% of C++ online submissions for Reverse Linked List.

三、優化措施

用翻轉鏈表法實現:

class Solution{
	public:
		ListNode* reverseList(ListNode* head){
			//翻轉鏈表 
			ListNode *pre = NULL;
			ListNode *cur = head;
			ListNode *tmp = NULL;
			while(cur!=NULL) {
				//記錄當前節點的下一個節點
				tmp = cur->next;
				//然後將當前節點指向pre
				cur->next = pre;
				//pre和cur節點都前進一位
				pre = cur;
				cur = tmp;
			}
			return pre;
		}
};
Runtime: 12 ms, faster than 38.84% of C++ online submissions for Reverse Linked List.
Memory Usage: 9.7 MB, less than 5.34% of C++ online submissions for Reverse Linked List.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章