本文以外觀數列為例,新增些許小手段,實現類似單連結串列
dummy
效果,化特殊為普通
引言
演算法邊界處理,在域內視角很麻煩,不是漏條件了,就是寫了一大堆相似處理邏輯,不甚優雅。
思路
將特殊的邊界情況,轉化為普通的元素,直接抹平。
外觀數列
- 雙指標
i
先行,但末元素無法處理自身,因此末位新增一個字串位$
,合理越界修復 for
與for range
兩個世界,一個索引位元組,條件檢測會自決可變性,而後者迴圈副本,rune值輸出
示例返回第n個外觀數列字串值
import "bytes"
import "strconv"
func countAndSay( n int ) string {
rs := "1"
var buf bytes.Buffer
for ;n>1;n--{
rs +="$"
for k,i:=0,1;i< len(rs);i++{
if rs[i-1]!=rs[i]{
buf.WriteString(strconv.Itoa(i-k))
buf.WriteByte(rs[i-1])
k=i
}
}
rs = buf.String()
buf.Reset()
}
return rs
}
單連結串列dummy
單連結串列的元素刪除,需要通過前驅元素操作,頭節點由於不存在前驅,往往需要特殊對待。
用構建dummy結點,簡化處理邏輯,將頭節點當作普通節點操作即可,示例刪除倒數第n個節點
func removeNthFromEnd( head *ListNode , n int ) *ListNode {
dummy := &ListNode{
Next: head,
}
slow,fast := dummy, dummy
for fast != nil && fast.Next != nil{
n--
if n < 0 {
slow = slow.Next
}
fast = fast.Next
}
slow.Next = slow.Next.Next
return dummy.Next
}
- 快慢指標找到被刪除節點的前置節點
- 用哨兵虛擬節點,解決原生鏈頭操作bug
本作品採用《CC 協議》,轉載必須註明作者和本文連結