直擊面試之鏈表

面試過程中經常會遇到鏈表相關面試,鏈表相較於數組區別是節點存儲空間不連續,可持續擴展。下面是使用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
	}
}

 

發佈了58 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章