目录
反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
}
用两个栈实现队列
CQueue 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead , 分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
type CQueue struct {
Stack1 *list.List
Stack2 *list.List
}
func Constructor1() CQueue {
return CQueue{
Stack1: list.New(),
Stack2: list.New(),
}
}
func (q *CQueue) AppendTail(value int) {
q.Stack1.PushBack(value)
}
func (q *CQueue) DeleteHead() int {
if q.Stack2.Len() > 0 {
e := q.Stack2.Back()
q.Stack2.Remove(e)
return e.Value.(int)
} else {
for q.Stack1.Len() > 0 {
q.Stack2.PushBack(q.Stack1.Remove(q.Stack1.Back()))
}
if q.Stack2.Len() == 0 {
return -1
} else {
e := q.Stack2.Back()
q.Stack2.Remove(e)
return e.Value.(int)
}
}
}
包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示:
各函数的调用总次数不超过 20000 次
输入
["MinStack","push","push","push","min","pop","top","min"]
[[],[-2],[0],[-3],[],[],[],[]]
输出
[null,null,null,null,-3,null,0,-2]
输入:
["MinStack","push","push","push","min","top","pop","min"]
[[],[-2],[0],[-1],[],[],[],[]]
输出:
[null,null,null,null,-2,-1,null,-2]
type MinStack struct {
AllStack *list.List
MinStack *list.List
}
// Constructor /** initialize your data structure here. */
func Constructor() MinStack {
return MinStack{
new(list.List),
new(list.List),
}
}
// Push 当辅助栈为空,或者入栈元素小于辅助栈的栈顶元素时入栈
func (s *MinStack) Push(x int) {
if s.MinStack.Len() <= 0 || x <= s.MinStack.Back().Value.(int) {
s.MinStack.PushBack(x)
}
s.AllStack.PushBack(x)
}
func (s *MinStack) Pop() {
if s.AllStack.Back().Value.(int) == s.MinStack.Back().Value.(int) {
s.MinStack.Remove(s.MinStack.Back())
}
s.AllStack.Remove(s.AllStack.Back())
}
func (s *MinStack) Top() int {
return s.AllStack.Back().Value.(int)
}
func (s *MinStack) Min() int {
return s.MinStack.Back().Value.(int)
}
从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reversePrint(head *ListNode) []int {
var Stack list.List
var Res []int
temp := head
//使用栈将链表元素顺序倒置
for temp != nil {
Stack.PushBack(temp.Val)
temp = temp.Next
}
for Stack.Len() > 0 {
e := Stack.Back()
Res = append(Res, e.Value.(int))
Stack.Remove(e)
}
return Res
}