单链表反转

单链表反转示例图片

  为了反转这个单链表,我们先让头结点的next域指向结点2,再让结点1的next域指向结点3,最后将结点2的next域指向结点1,就完成了第一次交换,顺序就变成了Header-结点2-结点1-结点3-结点4-NULL,然后进行相同的交换将结点3移动到结点2的前面,然后再将结点4移动到结点3的前面就完成了反转,思路有了

package main

import (
	"fmt"
)

//反转单链表,头指针,单链表

type List struct {
	next *List
	data int
}

var Head = &List{}

func add_node(val int) {
	newnode := &List{data: val}
	if Head.next == nil {
		Head.next = newnode
	} else {
		newnode.next = Head.next
		Head.next = newnode
	}
}

func show_list() {
	tmp := Head.next
	for tmp != nil {

		fmt.Printf("%d ", tmp.data)
		tmp = tmp.next
	}
	fmt.Printf("\n")
}

//example:例如此例子,1往后面链,Head往1后面那个节点前一个节点链,此节点往前一个节点链
//  1->3 2->1 H->2 ----->  1->4 3->2 H->4 .............

func reverse_list() {
	tmp := Head.next
	for tmp.next != nil {

		midnode := tmp.next
		tmp.next = tmp.next.next
		midnode.next = Head.next
		Head.next = midnode
	}
}

func main() {
	add_node(1)
	add_node(5)
	add_node(6)
	add_node(10)

	show_list()

	reverse_list()
	show_list()
}

输出结果:

10 6 5 1 
1 5 6 10

总结:head,1节点(顺序时候第一个,逆序时候倒数第一个)往后链,中间节点反链

你可能感兴趣的:(单链表反转)