翻转链表-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
}
浙公网安备 33010602011771号