单链表python和go的代码

go version

package main
import "fmt"
type Objecter interface {} //任意对象类型
type Node struct{
    Data Objecter
    Next *Node //指针类型
}

type List struct {
    headNode *Node
}

//判断是否为空的单链表
func (l *List) IsEmpty() bool {
   if l.headNode == nil{
    return true
   }else{
    return false
   }
}

//单链表的长度
func (l *List) Length() int{
    cursor :=l.headNode
    count := 0
    for cursor != nil{
        count++
        cursor = cursor.Next
    }
    return count
}

//获取头部节点
func (l *List) GetHeadNode() *Node{
    
   return l.headNode

}

//从头部添加元素
func (l *List) Add (data Objecter){
    node:=&Node{Data:data} //传入值转为node对象
    node.Next = l.headNode //将节点的next指针指向head即可。
    l.headNode = node //再把当前的节点指向head,也就是head前移了

}

//从尾部添加元素
func (l *List) Append (data Objecter){
    //首先根据传入的值转成node节点
    node := &Node{Data:data}
    //判断是否为空
    if l.IsEmpty(){
        //将head指向当前的节点
        l.headNode = node
    }else{
        cursor:=l.headNode
        for cursor.Next!=nil{
            //游标往后元素移动
            //知道下个
            cursor = cursor.Next
        }
        cursor.Next = node
    }
}

//在指定位置添加元素
func (l *List) Insert(index int,data Objecter){
    if index <0 {
        //如果index小于0,加在头上
        l.Add(data)
    }else if index > l.Length(){
        l.Append(data)
    }else{
        pre :=l.headNode
        count:=0
        for count<(index-1){
            pre = pre.Next
            count++
        }
        node :=&Node{Data:data}
        //pre.Next表示需要插入位置的下一个节点
        //node.Next指向后面的节点
        //然后前面的节点指向node
        node.Next = pre.Next
        pre.Next = node

    }

}
func (l *List) Remove(data Objecter){
    pre := l.headNode
    if pre.Data ==data{
        l.headNode = pre.Next
    }else{
        for pre.Next != nil{
            if pre.Next.Data ==data{
                pre.Next = pre.Next.Next
            }else{
                pre = pre.Next
            }
        }
    }
}
func (l *List) Contain(data Objecter) bool {
    cursor:=l.headNode
    for cursor!=nil{
        if cursor.Data ==data{
            return true
        }
        cursor = cursor.Next
    }
    return false
}

func traverseLinkList(l *List){
    head:=l.GetHeadNode()
    for head!=nil{
        fmt.Println(head.Data)
        head = head.Next
    }
    fmt.Println("======")
}
func main() {
    list := List{}
    
    //尾部添加
    list.Append(1)
    list.Append(2)
    list.Append(3)
    list.Append(4)
     
    //头部添加
    list.Add(5)
    fmt.Println("长度===",list.Length()) 

    //判断是否为空链表
    bool:=list.IsEmpty()
    fmt.Println(bool)   

    //在指定位置2插入23
    list.Insert(2,23)
    traverseLinkList(&list)
    
    //是否包含元素23
    isContain :=list.Contain(23)
    fmt.Println("isContain: ",isContain) 

    //是否包含元素57
    isContain =list.Contain(57)
    fmt.Println("isNotContain: ",isContain)

    //删除57
    list.Remove(23)
    traverseLinkList(&list)

}

python version

class Node:
    def __init__(self,value=None):
        self.value = value
        self.next = None

class LinkList:
    def __init__(self,head = None):
        self.head = head

    def is_empty(self):
       """
       判断链表是否为空
       """
       flag = False
       pre = self.head
       if pre.value is None:
            flag = True
       return flag

    def length(self):
        """
        获取链表的长度
        """
        cursor = self.head
        count = 0
        while cursor is not None:
               cursor = cursor.next
               count+=1
        return count  

    def get_head_node(self):
        """
        获取头部节点
        """
        return self.head

    def add(self,value):
        """
        从头部添加元素
        """  
        node = Node(value =value)
        node.next = self.head
        self.head = node

    def append(self,value) :
        """
        从尾部添加元素
        """   
        node = Node(value = value)  
        cursor = self.head 
        if self.head is None:
            self.head = node
        else:    
            while cursor.next is not None:
                cursor = cursor.next
            cursor.next = node    
    def insert(self,index,value):
        if index < 0:
             self.add(value)
        elif index > self.length():
            self.append(value) 
        else:
            count = 0
            cursor = self.head
            while count < index -1:
                cursor = cursor.next
                count+=1
            node = Node(value = value)  
            # cursor.next = node.next
            # node = cursor.next
            node.next = cursor.next
            cursor.next = node
    def remove(self,value):
        cursor = self.head
        if cursor.value == value:
            self.head = cursor.next
        else:
                #判断next的值比较好
                while cursor.next is not None:
                   if cursor.next.value==value:
                        cursor.next = cursor.next.next
                   else:    
                        cursor = cursor.next
                #如果使用cursor则需要知道前面的节点是什么。
                # pre = None
                # while cursor is not None:

                #    curosr = cursor.next
                #    pre = cursor
                #    if cursor.value==value:
                #         pre.next = cursor.next

    def contains(self,value):
        cursor = self.head
        flag = False
        if cursor.value == value:
            flag = True
        else:     
            while cursor is not None:
                if cursor.value == value:
                    flag = True
                    break
                else:
                    cursor = cursor.next    
            else:
                flag = False    
        return flag
    
    def traverse_list(self):
        head = self.get_head_node()
        cursor = head
        while cursor is not None:
            print(cursor.value)
            cursor = cursor.next
        print("traverse_over")    

    
def main():
    l = LinkList()
    l.append(1)
    l.append(2)
    l.append(3)
    l.append(4)

    l.add(5)

    print("长度===",l.length()) 

    #判断是否为空链表
    bool=l.is_empty()
    print(bool)   

    #在指定位置2插入23
    l.insert(2,23)
    l.traverse_list()
    
    #是否包含元素23
    is_contain =l.contains(23)
    print("is_contain: ",is_contain) 

    #是否包含元素57
    is_contain =l.contains(57)
    print("is_not_contain: ",is_contain)

    #删除23
    l.remove(23)
    l.traverse_list()


if __name__ == "__main__":
    main()

相关推荐