今日题目:
203. 移除链表元素
707. 设计链表
206. 反转链表
203.移除链表元素
要点:
1. 没啥说的,添加虚拟头节点以统一对链表元素的操作即可。
代码:
func removeElements(head *ListNode, val int) *ListNode {
if head == nil {
return nil
}
newHead := &ListNode{Val: -1, Next: head}
pre := newHead
for head != nil{
if head.Val == val {
pre.Next = head.Next
} else {
pre = pre.Next
}
head = head.Next
}
return newHead.Next
}
707. 设计链表
要点:
1. 考察对链表基础的理解,重点完成插入功能。
2. 分清楚链表结构体和节点结构体。
代码:
type MyLinkedList struct {
head *ListNode
size int
}
func Constructor() MyLinkedList {
return MyLinkedList{&ListNode{}, 0}
}
func (l *MyLinkedList) Get(index int) int {
if index < 0 || index >= l.size {
return -1
}
cur := l.head
for i := 0; i <= index; i++ {
cur = cur.Next
}
return cur.Val
}
func (l *MyLinkedList) AddAtHead(val int) {
l.AddAtIndex(0, val)
}
func (l *MyLinkedList) AddAtTail(val int) {
l.AddAtIndex(l.size, val)
}
func (l *MyLinkedList) AddAtIndex(index, val int) {
if index > l.size {
return
}
index = max(index, 0)
l.size++
pred := l.head
for i := 0; i < index; i++ {
pred = pred.Next
}
toAdd := &ListNode{val, pred.Next}
pred.Next = toAdd
}
func (l *MyLinkedList) DeleteAtIndex(index int) {
if index < 0 || index >= l.size {
return
}
l.size--
pred := l.head
for i := 0; i < index; i++ {
pred = pred.Next
}
pred.Next = pred.Next.Next
}
func max(a, b int) int {
if b > a {
return b
}
return a
}
206. 反转链表
要点:
1. 题目不难 但是写一次忘一次 重点在于整理清楚当前节点与前后节点的关系
2. 要使用临时变量存放当前节点的后继节点
图片来自代码随想录,其中3号节点需要使用temp临时存放
代码:
func reverseList(head *ListNode) *ListNode {
cur := head
var pre *ListNode = nil
var temp *ListNode = nil
for cur != nil {
temp = cur.Next
cur.Next = pre
pre = cur
cur =temp
}
return pre
}