golang之反转单链表实现

1.给定一个链表,将链表的值进行反转???
有如下两种方式:

  • 1.遍历法
  • 2.递归法

代码实现如下

package other_pratice

import (
	"fmt"
	"strconv"
)

type ListNode struct {
	next *ListNode
	val  int
}

func NewListNode(val int) *ListNode {
	return &ListNode{next: nil, val: val}
}

// 递归的方式
// 递归的关键是退出条件和推导公式: 当node.next==nil的时候,即是退出条件。  推导公式即是:将node的指针反转,并将之前的node节点的next置为空。并返回node的下一个节点。
func ReserveListNodeByRecursion(node *ListNode) *ListNode {
	if node != nil && node.next == nil {
		return node
	}
	newNode := ReserveListNodeByRecursion(node.next)
	node.next.next = node
	node.next = nil

	return newNode
}

// 采用遍历的方式

// 初始化两个变量,pre和cur,  遍历node,将node的next指向前一个及诶单,也就是pre,  将pre赋值为本节点,cur为本节点的next节点
func ReserveListNodeByTraverse(node *ListNode) *ListNode {
	var pre *ListNode
	var cur *ListNode
	for node != nil {
		cur = node.next
		node.next = pre
		pre = node
		node = cur
	}
	return pre
}

func (ld *ListNode) Print() {
	format := ""
	for ld.next != nil {
		format += strconv.Itoa(ld.val)
		ld = ld.next
		format += "---->"
	}
	format += strconv.Itoa(ld.val)
	fmt.Println(format)
}

测试

package other_pratice

import (
	"fmt"
	"testing"
)

func TestReverseListNode(t *testing.T) {

	list := NewListNode(0)
	alist := NewListNode(1)
	blist := NewListNode(2)
	clist := NewListNode(3)
	list.next=alist
	alist.next=blist
	blist.next=clist
	list.Print()
	fmt.Println("反转后")
	res:=ReserveListNodeByTraverse(list)
	//res:=ReserveListNodeByRecursion(list)
	res.Print()
}

output

=== RUN   TestReverseListNode
0---->1---->2---->3
"反转后"
3---->2---->1---->0
--- PASS: TestReverseListNode (0.00s)
PASS

Process finished with exit code 0
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值