golang--实现简易的单链表

1,186 阅读1分钟

package data_structure

import ( "fmt" "testing" )

type node struct { data int // 数据域 next *node // 指针域 }

type SingleList struct { head *node // 头指针 length int // 单链表长度 }

func TestSingleList(t *testing.T) { s := &SingleList{} s.Insert(2) s.Insert(3) s.Insert(4) fmt.Println(s.FindAll()) fmt.Println(s.Delete(4)) fmt.Println(s.FindAll()) fmt.Println(s.Contains(12))

}

// Delete:删除某一个元素 func (s *SingleList) Delete(data int) (isSuccess bool) { if s.IsEmpty() { // 链表为空 return }

n := s.head.next
pre := s.head
for n != nil {
	if n.data == data { // 找到这个元素了
		isSuccess = true
		pre.next = n.next
		break
	} else {
		pre = n // 保存父节点
		n = n.next
	}
}
s.length--
if s.IsEmpty() {
	s = nil
}
return

}

// Contains: 是否包含某个元素 func (s *SingleList) Contains(data int) (isExist bool) { if s.IsEmpty() { return }

n := s.head.next
for n != nil {
	if n.data == data {
		isExist = true
		return
	}
	n = n.next
}
return

}

// FindAll:获取全部元素 func (s *SingleList) FindAll() (val []int) { if s.IsEmpty() { return } n := s.head.next for n != nil { // val = append(val, n.data) n = n.next } //val = append(val, n.data) return }

// Insert:向单链表添加某个元素 func (s *SingleList) Insert(data int) { s.length++ n := &node{ data: data, } // 表示是空链表 if s.head == nil { s.head = &node{} s.head.next = n //s.head = n return } // 遍历,然后追加节点 tmp := s.head.next for tmp.next != nil { tmp = tmp.next } tmp.next = n }

// IsEmpty:判断链表是否为空 func (s *SingleList) IsEmpty() bool { return s.head == nil }