leetcode:Go实现翻转链表

561 阅读2分钟

题目:

思路:

原始链表

  • 声明一个空的节点(pre),表示前一个节点
  • 变量 cur 表示第一个节点

开始:

  1. 将第二个节点“位置”先保存到一个临时变量,防止 1,2 节点断开后找不到2节点;
  2. 第一个节点 cur 的 next 指向 pre ,完成 1 节点的翻转;
  3. pre 和 cur 分别向后移动一个节点;
  4. 重复上面 3 步,依次完成节点翻转;

翻转步骤1

翻转步骤2

翻转步骤3

核心代码:

//反转链表的实现
func reverseList(head *ListNode) *ListNode {
	var pre *ListNode = nil
	cur := head
	for cur != nil {
		nextTemp := cur.Next //1. 将下一个节点保存到临时变量,防止下面覆盖丢失
		cur.Next = pre       //2. 当前节点指向前节点,当前节点完成转换
		pre = cur            //3. 前节点变当前节点,给下一个节点转换做准备
		cur = nextTemp       //4. 当前节点变下节点,给下一个节点转换做准备
		//pre, cur, cur.Next = cur, cur.Next, pre //上面四步可以总结为此处一行
	}
	return pre
}

完整代码演示:

package main

import "fmt"

//链表节点
type ListNode struct {
	Val  int
	Next *ListNode
}

//反转链表的实现
func reverseList(head *ListNode) *ListNode {
	var pre *ListNode = nil
	cur := head
	for cur != nil {
		nextTemp := cur.Next //1. 将下一个节点保存到临时变量,防止下面覆盖丢失
		cur.Next = pre       //2. 当前节点指向前节点,当前节点完成转换
		pre = cur            //3. 前节点变当前节点,给下一个节点转换做准备
		cur = nextTemp       //4. 当前节点变下节点,给下一个节点转换做准备
		//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

	this1 := head
	for this1 != nil {
		fmt.Println(this1.Val)
		this1 = this1.Next
	}

	pre := reverseList(head)
	fmt.Println("翻转后:")
	this2 := pre
	for this2 != nil {
		fmt.Println(this2.Val)
		this2 = this2.Next
	}
}

运行结果:

1
2
3
4
5
翻转后:
5
4
3
2
1