首页 > 编程语言 > 详细

go实现处理链表的算法

时间:2021-03-15 19:14:30      阅读:27      评论:0      收藏:0      [点我收藏+]

链表的算法分为几种类型

1,删除链表的倒数第N个节点

2,合并两个有序链表

3,判断链表是否是环形链表

4,两个链表的位数相加

package main

import "fmt"

type ListNode struct {
	data int
	next *ListNode
}

//删除链表倒数第N个节点
func deleteListNode(head *ListNode,n int) *ListNode {
	result := &ListNode{}
	result.next = head
	var pre *ListNode
	cur := result
	i :=1
	for head != nil{
		if i >=n{
			pre = cur
			cur = cur.next
		}
		head = head.next
		i++
	}
	pre.next = pre.next.next
	return result.next
}

//合并两个有序链表
func sumTwoListNode(l1 *ListNode,l2 *ListNode) *ListNode {
	preHead := &ListNode{}
	result := preHead
	for l1 !=nil && l2 != nil{
		if l1.data<l2.data{
			preHead.next = l1
			l1 = l1.next
		}else{
			preHead.next = l2
			l2 = l2.next
		}
		preHead = preHead.next
	}
	if l1 !=nil{
		preHead.next = l1
	}
	if l2 != nil{
		preHead.next = l2
	}
	return result.next
}

//方式1 ,使用map
func isCycle(head *ListNode) bool{
	m1 := make(map[*ListNode]int)
	for head != nil{
		if _,ok := m1[head];ok{
			return true
		}
		m1[head] = 1
		head = head.next
	}
	return false
}

func isCycleTwo(head *ListNode) bool {
	if head == nil{
		return false
	}
	fast := head.next //走两步的初始指针
	for head !=nil && fast !=nil && fast.next !=nil{
		if head == fast{
			return true
		}
		fast = fast.next.next
		head = head.next
	}
	return false
}
//给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
func sumTwolist(l1 *ListNode,l2 *ListNode) *ListNode {
	list := &ListNode{0,nil}
	result :=list
	tmp :=0
	for l1 !=nil || l2 !=nil || tmp !=0{
		if l1 !=nil{
			tmp +=l1.data
			l1 = l1.next
		}
		if l2 !=nil{
			tmp +=l2.data
			l2 = l2.next
		}
		list.next = &ListNode{tmp%10,nil}
		tmp = tmp/10
		list = list.next
	}
	return result.next
}

func main() {
	list := []int{1,2,3}
	head := &ListNode{data:list[0]}
	tail := head
	for i:=1;i<len(list);i++{
		tail.next = &ListNode{data: list[i]}
		tail = tail.next
	}

	//************删除测试
	//newList := deleteListNode(head,2)
	//newList.show()

	list2 := []int{4,5,6}
	head2 := &ListNode{data:list2[0]}
	tail2 := head2
	for i :=1;i<len(list2);i++{
		tail2.next = &ListNode{data: list2[i]}
		tail2 = tail2.next
	}
	//合并两个链表测试
	//newlist2 := sumTwoListNode(head,head2)
	//newlist2.show()

	//测试两个链表相加
	newlist3 := sumTwolist(head,head2)
	newlist3.show()

}

//打印链表
func (l *ListNode) show() {
	fmt.Println(l.data)
	for l.next != nil{
		l = l.next
		fmt.Println(l.data)
	}
}

  

go实现处理链表的算法

原文:https://www.cnblogs.com/pebblecome/p/14539310.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!