题目描述
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
样例
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
解题思路
-
普通思路
-
描述
新建一个链表头结点,每次取出原链表第一个元素,放到新建链表第一个元素的位置。
-
实现代码:
/* struct ListNode { int val; struct ListNode* next; ListNode(int val) { this->val = val; this->next = NULL; } }; */ ListNode* reverseList(ListNode* head) { ListNode* newhead = new ListNode(-1); ListNode* tmp; while(head->next) { tmp = head->next; head->next = tmp->next; tmp->next = newhead->next; newhead->next = tmp; } return newhead; }
-
复杂度分析
时间复杂度: O ( n ) O( n) O(n)
空间复杂度: ≈ O ( 1 ) \approx O( 1) ≈O(1)
-
-
普通思路
-
描述
从第一个元素出发,每次将当前元素添加到新的链表串中。最后用原来的头结点指向新的链表串即可。
-
实现代码:
/* struct ListNode { int val; struct ListNode* next; ListNode(int val) { this->val = val; this->next = NULL; } }; */ ListNode* reverseList(ListNode* head) { ListNode* newptr = null; ListNode* p = head->next,tmp; while(p) { tmp = p->next; p->next = newptr; newptr = p; p = tmp; } head->next = newptr; return head; }
-
复杂度分析
时间复杂度:$ \approx O(n)$
空间复杂度:$ \approx O(1)$
-