当前位置:   article > 正文

LeetCode刷题-链表-交换/反转链表_leetcode 链表交换

leetcode 链表交换

目录

LeetCode024.两两交换链表中的节点|Mid

一、题目

二、实现方法 

        方法一:递归

方法二:迭代

三、可直接执行代码块

LeetCode206.反转链表| Easy

一、题目

二、实现方法 

方法一:迭代

三、可直接执行代码块

持续更新...




LeetCode024.两两交换链表中的节点|Mid

一、题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]

输出:[2,1,4,3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

思路:

一、递归

1. 两两一组,head,nexthead,nexthead.next是下一对的开始

2. 返回新的头

时间复杂度,空间复杂度 O(N)

二、迭代

1.注意要循环调节要判断后面两个值都不为nil

2.创建一个亚节点

3.先连两边再连中间

时间复杂度O(N),空间复杂度O(1)

二、实现方法 

方法一:递归

1. 两两一组,head,nexthead,nexthead.next是下一对的开始

2. 返回新的头

时间复杂度,空间复杂度 O(N)

  1. func swapPairs(head *ListNode) *ListNode{
  2. if head==nil||head.Next==nil{
  3. return head
  4. }
  5. newHead:=head.Next
  6. head.Next=swapPairs(newHead.Next)
  7. newHead.Next=head
  8. return newHead
  9. }

方法二:迭代

1.注意要循环调节要判断后面两个值都不为nil

2.创建一个亚节点

3.先连两边再连中间

时间复杂度O(N),空间复杂度O(1)

  1. func swapPairs(head *ListNode) *ListNode {
  2. if head == nil || head.Next == nil {
  3. return head
  4. }
  5. dummy := &ListNode{}
  6. dummy.Next = head
  7. temp := dummy
  8. node1 := head
  9. for node1 != nil && node1.Next != nil {
  10. node2 := node1.Next
  11. temp.Next = node2
  12. node1.Next = node2.Next
  13. node2.Next = node1
  14. temp = node1
  15. node1 = temp.Next
  16. }
  17. return dummy.Next
  18. }

三、可直接执行代码块

  1. func main() {
  2. a := initNode(4, nil)
  3. b := initNode(3, a)
  4. c := initNode(2, b)
  5. //head:=initNode(1,c)
  6. PrintListNode(c)
  7. newHead := swapPairs(c)
  8. PrintListNode(newHead)
  9. }
  10. type ListNode struct {
  11. Val int
  12. Next *ListNode
  13. }
  14. func initNode(val int, next *ListNode) *ListNode {
  15. return &ListNode{
  16. Val: val,
  17. Next: next,
  18. }
  19. }
  20. func PrintListNode(node *ListNode) {
  21. for node != nil {
  22. fmt.Println(node.Val)
  23. node = node.Next
  24. }
  25. }
  26. // 递归法
  27. /*func swapPairs(head *ListNode) *ListNode{
  28. if head==nil||head.Next==nil{
  29. return head
  30. }
  31. newHead:=head.Next
  32. head.Next=swapPairs(newHead.Next)
  33. newHead.Next=head
  34. return newHead
  35. }
  36. */
  37. // 迭代
  38. func swapPairs(head *ListNode) *ListNode {
  39. if head == nil || head.Next == nil {
  40. return head
  41. }
  42. dummy := &ListNode{}
  43. dummy.Next = head
  44. temp := dummy
  45. node1 := head
  46. for node1 != nil && node1.Next != nil {
  47. node2 := node1.Next
  48. temp.Next = node2
  49. node1.Next = node2.Next
  50. node2.Next = node1
  51. temp = node1
  52. node1 = temp.Next
  53. }
  54. return dummy.Next
  55. }

LeetCode206.反转链表| Easy

一、题目

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

示例 1:


输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:


输入:head = [1,2]
输出:[2,1]
示例 3:

输入:head = []
输出:[]
 

提示:

链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
 

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

二、实现方法 

方法一:迭代

定义头结点为当前结点,

反转需要交换前要先记录下一个节点,为了反转后归位

时间复杂O(n),空间复杂度O(1)

  1. func reverseList(head *ListNode) *ListNode {
  2. var prev *ListNode
  3. cur:=head
  4. for cur!=nil{
  5. next:=cur.Next
  6. cur.Next=prev
  7. prev=cur
  8. cur=next
  9. }
  10. return prev
  11. }

方法二:递归

   1. 确定终止条件,head!=nil一定能写出来;
   2. 递归公式:返回值为下一个节点
   3. 记录下一个位置(head.Next.Next,此时发现终止条件应该加一个head.Next!=nil),为了归位
   4. head.Next=nil,否则可能会产生环

时间复杂O(n),空间复杂度O(n)

  1. func reverseList2(head *ListNode) *ListNode {
  2. if head==nil || head.Next==nil {
  3. return nil
  4. }
  5. newNode:=reverseList2(head.Next)
  6. head.Next.Next=head
  7. head.Next=nil
  8. return newNode
  9. }

三、可直接执行代码块

  1. package main
  2. import "fmt"
  3. func main() {
  4. a:=initNode(1,nil)
  5. b:=initNode(2,a)
  6. c:=initNode(3,b)
  7. d:=initNode(4,c)
  8. head:=initNode(5,d)
  9. PrintListNode(head)
  10. reverseList2(head)
  11. fmt.Println("----------------------------")
  12. PrintListNode(a)
  13. }
  14. type ListNode struct {
  15. Val int
  16. Next *ListNode
  17. }
  18. func initNode(val int, next *ListNode) *ListNode {
  19. return &ListNode{
  20. Val: val,
  21. Next: next,
  22. }
  23. }
  24. func PrintListNode(node *ListNode){
  25. for node!=nil{
  26. fmt.Println(node.Val)
  27. node=node.Next
  28. }
  29. }
  30. // 迭代
  31. // 反转需要交换前要先记录下一个节点,为了反转后归位
  32. func reverseList(head *ListNode) *ListNode {
  33. var prev *ListNode
  34. cur:=head
  35. for cur!=nil{
  36. next:=cur.Next
  37. cur.Next=prev
  38. prev=cur
  39. cur=next
  40. }
  41. return prev
  42. }
  43. // 递归
  44. /* 1. 确定终止条件,head!=nil一定能写出来;
  45. 2. 递归公式:返回值为下一个节点
  46. 3. 记录下一个位置(head.Next.Next,此时发现终止条件应该加一个head.Next!=nil),为了归位
  47. 4. head.Next=nil,否则可能会产生环*/
  48. func reverseList2(head *ListNode) *ListNode {
  49. if head==nil || head.Next==nil {
  50. return nil
  51. }
  52. newNode:=reverseList2(head.Next)
  53. head.Next.Next=head
  54. head.Next=nil
  55. return newNode
  56. }

持续更新...

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

闽ICP备14008679号