07_linkedlist
This commit is contained in:
parent
cc189078e3
commit
3551b0820a
146
go/07_linkedlist/main.go
Normal file
146
go/07_linkedlist/main.go
Normal file
@ -0,0 +1,146 @@
|
||||
package _7_linkedlist
|
||||
|
||||
import "fmt"
|
||||
|
||||
//单链表节点
|
||||
type ListNode struct {
|
||||
next *ListNode
|
||||
value interface{}
|
||||
}
|
||||
|
||||
//单链表
|
||||
type LinkedList struct {
|
||||
head *ListNode
|
||||
}
|
||||
|
||||
//打印链表
|
||||
func (this *LinkedList) Print() {
|
||||
cur := this.head.next
|
||||
format := ""
|
||||
for nil != cur {
|
||||
format += fmt.Sprintf("%+v", cur.value)
|
||||
cur = cur.next
|
||||
if nil != cur {
|
||||
format += "->"
|
||||
}
|
||||
}
|
||||
fmt.Println(format)
|
||||
}
|
||||
|
||||
/*
|
||||
单链表反转
|
||||
时间复杂度:O(N)
|
||||
*/
|
||||
func (this *LinkedList) Reverse() {
|
||||
if nil == this.head || nil == this.head.next || nil == this.head.next.next {
|
||||
return
|
||||
}
|
||||
|
||||
var pre *ListNode = nil
|
||||
cur := this.head.next
|
||||
for nil != cur {
|
||||
tmp := cur.next
|
||||
cur.next = pre
|
||||
pre = cur
|
||||
cur = tmp
|
||||
}
|
||||
|
||||
this.head.next = pre
|
||||
}
|
||||
|
||||
/*
|
||||
判断单链表是否有环
|
||||
*/
|
||||
func (this *LinkedList) HasCycle() bool {
|
||||
if nil != this.head {
|
||||
slow := this.head
|
||||
fast := this.head
|
||||
for nil != fast && nil != fast.next {
|
||||
slow = slow.next
|
||||
fast = fast.next.next
|
||||
if slow == fast {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/*
|
||||
两个有序单链表合并
|
||||
*/
|
||||
func MergeSortedList(l1, l2 *LinkedList) *LinkedList {
|
||||
if nil == l1 || nil == l1.head || nil == l1.head.next {
|
||||
return l2
|
||||
}
|
||||
if nil == l2 || nil == l2.head || nil == l2.head.next {
|
||||
return l1
|
||||
}
|
||||
|
||||
l := &LinkedList{head: &ListNode{}}
|
||||
cur := l.head
|
||||
curl1 := l1.head.next
|
||||
curl2 := l2.head.next
|
||||
for nil != curl1 && nil != curl2 {
|
||||
if curl1.value.(int) > curl2.value.(int) {
|
||||
cur.next = curl2
|
||||
curl2 = curl2.next
|
||||
} else {
|
||||
cur.next = curl1
|
||||
curl1 = curl1.next
|
||||
}
|
||||
cur = cur.next
|
||||
}
|
||||
|
||||
if nil != curl1 {
|
||||
cur.next = curl1
|
||||
} else if nil != curl2 {
|
||||
cur.next = curl2
|
||||
}
|
||||
|
||||
return l
|
||||
}
|
||||
|
||||
/*
|
||||
删除倒数第N个节点
|
||||
*/
|
||||
func (this *LinkedList) DeleteBottomN(n int) {
|
||||
if n <= 0 || nil == this.head || nil == this.head.next {
|
||||
return
|
||||
}
|
||||
|
||||
fast := this.head
|
||||
for i := 1; i <= n && fast != nil; i++ {
|
||||
fast = fast.next
|
||||
}
|
||||
|
||||
if nil == fast {
|
||||
return
|
||||
}
|
||||
|
||||
slow := this.head
|
||||
for nil != fast.next {
|
||||
slow = slow.next
|
||||
fast = fast.next
|
||||
}
|
||||
slow.next = slow.next.next
|
||||
}
|
||||
|
||||
/*
|
||||
获取中间节点
|
||||
*/
|
||||
func (this *LinkedList) FindMiddleNode() *ListNode {
|
||||
if nil == this.head || nil == this.head.next {
|
||||
return nil
|
||||
}
|
||||
if nil == this.head.next.next {
|
||||
return this.head.next
|
||||
}
|
||||
|
||||
slow, fast := this.head, this.head
|
||||
for nil != fast && nil != fast.next {
|
||||
slow = slow.next
|
||||
fast = fast.next.next
|
||||
}
|
||||
return slow
|
||||
}
|
59
go/07_linkedlist/main_test.go
Normal file
59
go/07_linkedlist/main_test.go
Normal file
@ -0,0 +1,59 @@
|
||||
package _7_linkedlist
|
||||
|
||||
import "testing"
|
||||
|
||||
var l *LinkedList
|
||||
|
||||
func init() {
|
||||
n5 := &ListNode{value: 5}
|
||||
n4 := &ListNode{value: 4, next: n5}
|
||||
n3 := &ListNode{value: 3, next: n4}
|
||||
n2 := &ListNode{value: 2, next: n3}
|
||||
n1 := &ListNode{value: 1, next: n2}
|
||||
l = &LinkedList{head: &ListNode{next: n1}}
|
||||
}
|
||||
|
||||
func TestReverse(t *testing.T) {
|
||||
l.Print()
|
||||
l.Reverse()
|
||||
l.Print()
|
||||
}
|
||||
|
||||
func TestHasCycle(t *testing.T) {
|
||||
t.Log(l.HasCycle())
|
||||
l.head.next.next.next.next.next.next = l.head.next.next.next
|
||||
t.Log(l.HasCycle())
|
||||
}
|
||||
|
||||
func TestMergeSortedList(t *testing.T) {
|
||||
n5 := &ListNode{value: 9}
|
||||
n4 := &ListNode{value: 7, next: n5}
|
||||
n3 := &ListNode{value: 5, next: n4}
|
||||
n2 := &ListNode{value: 3, next: n3}
|
||||
n1 := &ListNode{value: 1, next: n2}
|
||||
l1 := &LinkedList{head: &ListNode{next: n1}}
|
||||
|
||||
n10 := &ListNode{value: 10}
|
||||
n9 := &ListNode{value: 8, next: n10}
|
||||
n8 := &ListNode{value: 6, next: n9}
|
||||
n7 := &ListNode{value: 4, next: n8}
|
||||
n6 := &ListNode{value: 2, next: n7}
|
||||
l2 := &LinkedList{head: &ListNode{next: n6}}
|
||||
|
||||
MergeSortedList(l1, l2).Print()
|
||||
}
|
||||
|
||||
func TestDeleteBottomN(t *testing.T) {
|
||||
l.Print()
|
||||
l.DeleteBottomN(3)
|
||||
l.Print()
|
||||
}
|
||||
|
||||
func TestFindMiddleNode(t *testing.T) {
|
||||
l.DeleteBottomN(1)
|
||||
l.DeleteBottomN(1)
|
||||
l.DeleteBottomN(1)
|
||||
l.DeleteBottomN(1)
|
||||
l.Print()
|
||||
t.Log(l.FindMiddleNode())
|
||||
}
|
Loading…
Reference in New Issue
Block a user