链表元素两两替换

leetCode27题
给定链表

给定
1-2-3-4-5-6-7
输出
2-1-4-3-6-5-7

思路双指针,通过三个指针链表,pre、cur、nex来不断移动和拼接链表
在这里插入图片描述

调试代码

package main

import (
	"fmt"
	"os"
)

/**
	tempHead = &ListNode{0,nil}
	tempHead.Next = head

	pre,cur,nex = tempHead,head,head.Next

	pre = 0-1-2-3-4-5-6-7
	cur = 1-2-3-4-5-6-7
	nex = 2-3-4-5-6-7

	for cur != nil && cur.Next != nil{

		cur.Next = nex.Next
		cur = 1-3-4-5-6-7

		nex.Next = cur
		nex = 2-1-3-4-5-6-7

		pre.Nex = nex
		pre = 0-2-1-3-4-5-6-7


		此时pre是取址,已经赋值给tempHead
		tempHead = 0-2-1-3-4-5-6-7

		为下次循环做准备
		pre = cur
		pre = 1-3-4-5-6-7
		cur = cur.next
		cur = 3-4-5-6-7
		if cur.Next == nil{
			break
		}
		nex = cur.Next
		nex = 4-5-6-7

		再次循环
		cur = 1-4-5-6-7
		nex = 4-3-5-6-7
		pre = 2-1-4-3-5-6-7
	}
*/

func recoverList(head *nodeList)*nodeList{
	if (head == nil) || (head.Next == nil) {
		return head
	}
	tmpHead := &nodeList{0, nil}
	tmpHead.Next = head
	pre, cur, nex := tmpHead, head, head.Next
	fmt.Println("pre",pre)
	fmt.Println("cur",cur)
	fmt.Println("nex",nex)
	for cur != nil && nex != nil {
		cur.Next = nex.Next
		fmt.Println()
		//fmt.Println("pre",pre)
		fmt.Println("cur",cur)
		fmt.Println("cur-next",cur.Next)
		//fmt.Println("nex",nex)
		nex.Next = cur
		fmt.Println()
		fmt.Println("nex",nex)
		fmt.Println("nex-next",nex.Next)
		pre.Next = nex
		fmt.Println()
		fmt.Println("pre",pre)
		fmt.Println("pre-next",pre.Next)
		fmt.Println("tmpHead",tmpHead)
		fmt.Println("tmpHead-next",tmpHead.Next)

		pre = cur
		fmt.Println()
		fmt.Println("pre",pre)
		fmt.Println("pre-next",pre.Next)
		fmt.Println("tmpHead",tmpHead)
		fmt.Println("tmpHead-next",tmpHead.Next)

		cur = cur.Next
		fmt.Println()
		fmt.Println("cur",cur)
		fmt.Println("cur-next",cur.Next)
		if cur == nil {
			break
		}
		nex = cur.Next
		fmt.Println()
		fmt.Println("nex",nex)
		fmt.Println("nex-next",nex.Next)
		fmt.Println()
		fmt.Println(tmpHead)
		fmt.Println(tmpHead.Next)
		os.Exit(3)
	}
	return tmpHead.Next
}

type nodeList struct {
	val int
	Next *nodeList
}

func main(){
	n1 := new(nodeList)
	n1.val = 1

	n2 := new(nodeList)
	n2.val = 2

	n3 := new(nodeList)
	n3.val = 3
	n4 := new(nodeList)
	n4.val = 4

	n5 := new(nodeList)
	n5.val = 5

	n6 := new(nodeList)
	n6.val = 6

	n7 := new(nodeList)
	n7.val = 7

	n1.Next = n2
	n2.Next = n3
	n3.Next = n4
	n4.Next = n5
	n5.Next = n6
	n6.Next = n7
	pre := recoverList(n1)

	fmt.Printf("%#v\n",pre)
	fmt.Printf("%#v\n",pre.Next)
	fmt.Printf("%#v\n",pre.Next.Next)
	fmt.Printf("%#v\n",pre.Next.Next.Next)
	fmt.Printf("%#v\n",pre.Next.Next.Next.Next)
	fmt.Printf("%#v\n",pre.Next.Next.Next.Next.Next)
	fmt.Printf("%#v\n",pre.Next.Next.Next.Next.Next.Next)
	//fmt.Printf("%#v\n",recoverList(n1).next.next.next)
	//fmt.Printf("%#v\n",recoverList(n1).next.next.next.next)
	//fmt.Printf("%#v\n",recoverList(n1).next.next.next.next.next)
	//fmt.Printf("%#v\n",recoverList(n1).next.next.next.next.next.next)
}
pre &{0 0xc000010200}
cur &{1 0xc000010210}
nex &{2 0xc000010220}

cur &{1 0xc000010220}
cur-next &{3 0xc000010230}

nex &{2 0xc000010200}
nex-next &{1 0xc000010220}

pre &{0 0xc000010210}
pre-next &{2 0xc000010200}
tmpHead &{0 0xc000010210}
tmpHead-next &{2 0xc000010200}

pre &{1 0xc000010220}
pre-next &{3 0xc000010230}
tmpHead &{0 0xc000010210}
tmpHead-next &{2 0xc000010200}

cur &{3 0xc000010230}
cur-next &{4 0xc000010240}

nex &{4 0xc000010240}
nex-next &{5 0xc000010250}

&{0 0xc000010210}
&{2 0xc000010200}
exit status 3

完整解析代码

tempHead = &ListNode{0,nil}
tempHead.Next = head

pre,cur,nex = tempHead,head,head.Next

pre = 0-1-2-3-4-5-6-7
cur = 1-2-3-4-5-6-7
nex = 2-3-4-5-6-7

for cur != nil && cur.Next != nil{

    cur.Next = nex.Next
    cur = 1-3-4-5-6-7
    
    nex.Next = cur
    nex = 2-1-3-4-5-6-7

    pre.Nex = nex
    pre = 0-2-1-3-4-5-6-7

  
    此时pre是取址,已经赋值给tempHead
    tempHead = 0-2-1-3-4-5-6-7

    为下次循环做准备
    pre = cur
    pre = 1-3-4-5-6-7
    cur = cur.next
    cur = 3-4-5-6-7
    if cur.Next == nil{
        break
    }
    nex = cur.Next
    nex = 4-5-6-7

    再次循环
    cur = 1-4-5-6-7
    nex = 4-3-5-6-7
    pre = 2-1-4-3-5-6-7
}

完整代码

package main

import (
	"fmt"
)

func recoverList(head *nodeList)*nodeList{
	if (head == nil) || (head.Next == nil) {
		return head
	}
	tmpHead := &nodeList{0, nil}
	tmpHead.Next = head
	pre, cur, nex := tmpHead, head, head.Next
	for cur != nil && nex != nil {
		cur.Next = nex.Next
		nex.Next = cur
		pre.Next = nex
		pre = cur
		cur = cur.Next
		if cur == nil {
			break
		}
		nex = cur.Next
	}
	return tmpHead.Next
}

type nodeList struct {
	val int
	Next *nodeList
}

func main(){
	n1 := new(nodeList)
	n1.val = 1

	n2 := new(nodeList)
	n2.val = 2

	n3 := new(nodeList)
	n3.val = 3
	n4 := new(nodeList)
	n4.val = 4

	n5 := new(nodeList)
	n5.val = 5

	n6 := new(nodeList)
	n6.val = 6

	n7 := new(nodeList)
	n7.val = 7

	n1.Next = n2
	n2.Next = n3
	n3.Next = n4
	n4.Next = n5
	n5.Next = n6
	n6.Next = n7
	pre := recoverList(n1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a...Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值