标签:var 定义 head ble code lock block 构建 最新
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
笨方法:遍历链表,新建一个栈保存遍历的值,最后再新建一个链表,将栈中的值存进链表
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
var stack []int //新建一个栈保存原链表遍历的值
var newHead *ListNode = head //新的链表的头节点
var tmp *ListNode //临时节点
cur := newHead
//保存原链表的值
for head!=nil{
stack = append(stack,head.Val)
head = head.Next
}
//构建新的链表
for len(stack) != 0{
tmp = cur.Next
cur.Val = stack[len(stack)-1]
stack = stack[:len(stack)-1]
cur = tmp
}
return newHead
}
//现在想想 为什么不直接将栈的类型设置位*ListNode类型呢 省的赋值了
func reverseList(head *ListNode) *ListNode {
var stack []*ListNode //新建一个栈保存原链表遍历的节点
if head == nil{ //需要增加一个判断为空的条件
return nil
}
//保存原链表的节点
for head.Next!=nil{
stack = append(stack,head)
head = head.Next
}
//构建新的链表
var newHead *ListNode = head //新的链表头节点此时指向原链表最后一个节点
for len(stack) != 0{
head.Next = stack[len(stack)-1]
head = head.Next
stack = stack[:len(stack)-1]
}
head.Next = nil
return newHead
}
双指针法
:原地调转链表指针的方向,需要cur指针初始为head,指向遍历的当前节点,pre指针初始位nil表示最新得头节点。还需要一个临时指针tmp作为保留cur的下一位
时间复杂度:O(1)
空间复杂度:O(1)
func reverseList(head *ListNode) *ListNode {
var pre *ListNode = nil
var tmp *ListNode
cur := head
for cur!=nil{
tmp = cur.Next
cur.Next = pre
pre = cur
cur = tmp
}
return pre
}
标签:var 定义 head ble code lock block 构建 最新
原文地址:https://www.cnblogs.com/zmk-c/p/14695835.html