翻转链表-go语言三种方式

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

1 使用双指针

这是最常规的方法,注意赋值的顺序即可

// reverseList
// @Description: 就地翻转单链表
// @param head
// @return *ListNode
func reverseList(head *ListNode) *ListNode {
	if head == nil {
		return nil
	}
	var slow *ListNode
	fast := head
	for head != nil {
		fast = head.Next
		head.Next = slow
		slow = head
		head = fast
	}
	return slow
}

2 使用栈

两层循环,第一次循环遍历链表所有节点,并且压栈(注意这里需要把所有入栈节点的Nex指针指空)

第二层循环从栈中依次取出元素,并拼接关系(这里有用一个哨兵节点记录列表的头)

// reverseList2
// @Description: 使用栈实现
// @param head
// @return *ListNode
func reverseList(head *ListNode) *ListNode {
	if head == nil {
		return nil
	}
	myStack := []*ListNode{}
	for cur := head;cur != nil; {
		temp := cur
		cur = cur.Next
		temp.Next = nil // 将每个节点的next指针指向空,防止后面死循环
		myStack = append(myStack,temp)

	}
	root := &ListNode{}
	cur := root // 哨兵节点记录链表的头
	for len(myStack) > 0{
		root.Next = myStack[len(myStack)-1]
		myStack = myStack[:len(myStack)-1]
		root = root.Next
	}
	return cur.Next
}

3 使用递归

最秀的写法

// reverseList3
// @Description: 使用递归实现
// @param head
// @return *ListNode
func reverseList(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	newHead := reverseList(head.Next)
	head.Next.Next = head
	head.Next = nil
	return newHead
}
posted @ 2022-04-28 14:29  代码小学生王木木  阅读(534)  评论(0)    收藏  举报