点击:题目链接:反转一个单链表。
思路
使用迭代的方式,我们可以创建一个尾节点,然后将链表依次改变顺序,最后返回尾节点。
需要注意的是,当我们改变链表前部节点的引用关系时,需要创建一个临时节点来保存它的后面节点
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
   | 
 
 
 
 
 
 
  class Solution { public:     ListNode* reverseList(ListNode* head) {         ListNode* tail = NULL;
          while(head){             ListNode* temp = head->next;             head->next = tail;             tail = head;             head = temp;         }         return tail;     } };
 
  | 
 
复杂度
时间:O(N) 空间:O(1)
思路
由于该解题也包含层层递进的关系在里面,我们也可以尝试使用递归的方式。和迭代的方式不同,递归是从尾部节点开始置换。
我们需要不断遍历到链表的尾部,然后开始不断层层反转尾部链表。
代码
1 2 3 4 5 6 7 8 9 10 11 12
   | class Solution { public:     ListNode* reverseList(ListNode* head) {         if(head ==NULL || head->next == NULL){             return head;         }         ListNode* p = reverseList(head->next);         head->next->next = head;         head->next = NULL;         return p;     } };
  | 
 
复杂度
时间:O(N), 空间:O(N)