当前位置:   article > 正文

206.反转链表_head->next->next=head

head->next->next=head

题目

 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例

 

思路

# 1.数组替换

我们定义一个数组,从头开始遍历链表,将链表的值保存到数组中,从头开始保存,然后再从头开始遍历链表,将数组的值赋值给链表,这次数组我们从尾开始遍历,这样子从形式上来说,我们也对链表完成了反转

# 2.迭代

链表问题大都都可以运用双指针思路,我们定义两个指针,一个走在前面,一个走在后面,每走一步就让前面的指针指向后面,最后走完就完成了反转,只不过其中得注意,需要申请一个临时变量保存一下快指针的下一步,不然就走丢了

# 3.递归

递归我们值需要搞明白一个

    head->next->next = head;

    head->next = NULL;

这个两个语句,仔细捋一下,就会发现,这个就完成了两个节点之间的反转,然后我们递归到最后一个节点,并且将其保存为新的头结点,从最后一个节点开始反转节点,就可以完成反转链表

代码

# 1.数组替换

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. /*
  9. struct ListNode* reverseList(struct ListNode* head)
  10. *struct ListNode* reverseList:将链表反转
  11. struct ListNode* head:未被反转的头结点
  12. 返回值:反转之后的头节点
  13. */
  14. struct ListNode* reverseList(struct ListNode* head){
  15. if(!head)
  16. {
  17. return NULL;
  18. }
  19. int ans[5001];
  20. int i, m = 0;
  21. struct ListNode * l = head;
  22. while(l)
  23. {
  24. ans[m++] = l->val;
  25. l = l->next;
  26. }
  27. l = head;
  28. while(l)
  29. {
  30. l->val = ans[--m];
  31. l = l->next;
  32. }
  33. return head;
  34. }

# 2.迭代

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. /*
  9. struct ListNode* reverseList(struct ListNode* head)
  10. *struct ListNode* reverseList:将链表反转
  11. struct ListNode* head:未被反转的头结点
  12. 返回值:反转之后的头节点
  13. */
  14. struct ListNode* reverseList(struct ListNode* head){
  15. if(!head)
  16. {
  17. return NULL;
  18. }
  19. struct ListNode * cus = head;
  20. struct ListNode * p = NULL;
  21. while(cus)
  22. {
  23. struct ListNode * n = cus->next;
  24. cus->next = p;
  25. p = cus;
  26. cus = n;
  27. }
  28. return p;
  29. }
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. /*
  9. struct ListNode* reverseList(struct ListNode* head)
  10. *struct ListNode* reverseList:将链表反转
  11. struct ListNode* head:未被反转的头结点
  12. 返回值:反转之后的头节点
  13. */
  14. struct ListNode* reverseList(struct ListNode* head) {
  15. if (head == NULL || head->next == NULL) {
  16. return head;
  17. }
  18. struct ListNode* newHead = reverseList(head->next);
  19. head->next->next = head;
  20. head->next = NULL;
  21. return newHead;
  22. }

 

时间空间复杂度

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/87049
推荐阅读
相关标签
  

闽ICP备14008679号