链表001-反转单链表

题目

输入 1->2->3->4->null
	输出 5->4->3->2->1->null

思路

思路 把指针指向前一个元素,后边的不断向前移动,并改变方向

pre 就是cur的最前边的那位(pre=cur)
cur就是当前元素后面链表元素(cur=cur.Next)
cur.Next肯定是pre(curl.Next=pre)原因是cur赋值给了pre

过程

在这里插入图片描述
在这里插入图片描述

代码

type ListNode struct {
	Val int
	Next *ListNode
}
/**************************************************************************/
//反转链表递归实现
func reversListTwo(head *ListNode)*ListNode{
	 if head == nil || head.Next == nil{
	 	return head
	 }
	 pre := reversListTwo(head.Next)
	 head.Next.Next = head
	 head.Next = nil
	 return pre
}
//反转链表one
func reversList(head *ListNode)*ListNode{
	cur := head
	var pre *ListNode = nil
	for cur != nil{
		pre ,cur ,cur.Next = cur,cur.Next,pre//关键点
	}
	return pre
}

func main(){
	head := new(ListNode)
	head.Val = 1
	ln2 := new(ListNode)
	ln2.Val = 2
	ln3 := new(ListNode)
	ln3.Val = 3
	ln4 := new(ListNode)
	ln4.Val = 4
	ln5 := new(ListNode)
	ln5.Val = 5
	head.Next = ln2
	ln2.Next = ln3
	ln3.Next = ln4
	ln4.Next = ln5

	pre := reversList(head)
	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)

}

验证

&main.ListNode{Val:5, Next:(*main.ListNode)(0xc000104210)}
&main.ListNode{Val:4, Next:(*main.ListNode)(0xc000104200)}
&main.ListNode{Val:3, Next:(*main.ListNode)(0xc0001041f0)}
&main.ListNode{Val:2, Next:(*main.ListNode)(0xc0001041e0)}
&main.ListNode{Val:1, Next:(*main.ListNode)(nil)}
(*main.ListNode)(nil)
  • 1
    点赞
  • 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、付费专栏及课程。

余额充值