面試過程中經常會遇到鏈表相關面試,鏈表相較於數組區別是節點存儲空間不連續,可持續擴展。下面是使用Go進行鏈表實現。
鏈表結構定義
//define the data struct
type LinkList struct {
pPrev *LinkList //Previous node pointer
pNext *LinkList //Next node pointer
Value interface{} //Store The Value of Node
}
鏈表的插入獲取值
//Create Node
func NewLinkList(value interface{}) *LinkList {
return &LinkList{nil, nil, value}
}
//Set Previous node pointer
func (pSelf *LinkList) SetPrev(pNode *LinkList) {
pSelf.pPrev = pNode
}
//Get Previous node pointer
func (pSelf *LinkList) GetPrev() *LinkList {
return pSelf.pPrev
}
//Set Next node pointer
func (pSelf *LinkList) SetNext(pNode *LinkList) {
pSelf.pNext = pNode
}
//Get Next node pointer
func (pSelf *LinkList) GetNext() *LinkList {
return pSelf.pNext
}
實現鏈表的排序功能以及遍歷
因爲鏈表節點是ANY類型,所以定義鏈表節點需要實現的比較以及打印接口
//鏈表節點需要實現的接口
type LinkLister interface {
Cmp(v interface{}) int //鏈表節點比較函數 1表示大於 0表示等於 -1表示小於
Print() //鏈表節點打印函數
}
實現鏈表有序插入以及遍歷
//遞歸實現兩有序鏈表合併 也可以實現有序鏈表插入節點 當鏈表較長時,遞歸耗用堆棧空間大,需改爲非遞歸優化
func OrderInsert(root, node *LinkList) *LinkList {
if nil == root {
return node
}
if nil == node {
return root
}
pRet := root
if r, ok := root.Value.(LinkLister); ok {
if r.Cmp(node.Value) < 0 {
root.pNext = OrderInsert(root.pNext, node)
} else {
pRet = node
node.pNext = OrderInsert(root, node.pNext)
}
}
return pRet
}
//鏈表的遍歷打印
func Dump(root *LinkList) {
for root != nil {
if r, ok := root.Value.(LinkLister); ok {
r.Print()
}
root = root.pNext
}
}