java算法题链表_链表算法题

1、反转链表

实现方法一:三指针遍历,pre+cur+next;时间复杂度O(n),空间复杂度O(1)。

func reverseList(head *ListNode) *ListNode {

var pre *ListNode

cur := head

for cur != nil {

next := cur.Next

cur.Next = pre

pre = cur

cur = next

}

return pre

}

实现方法二:递归解法,1+ (reverse(2,3));时间复杂度O(n),空间复杂度O(n)(递归调用要占用系统栈空间)。

func reverseList(head *ListNode) *ListNode {

//1.递归结束

if head == nil || head.Next == nil{

return head

}

//2.递归主体

newHead := reverseList(head.Next)

head.Next.Next = head

head.Next = nil

return newHead

}

2、删除链表的节点

解法:增加dummyHead,把删除头尾节点的特殊情况,变成了普通情况。

func removeElements(head *ListNode, val int) *ListNode {

dummyHead := &ListNode{}

dummyHead.Next = head

cur := dummyHead

for cur.Next != nil{

if cur.Next.Val == val{

cur.Next = cur.Next.Next

}else{

cur = cur.Next

}

}

return dummyHead.Next

}

3、合并两个有序单向链表

func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {

dummyHead := &ListNode{}

cur := dummyHead

for l1 != nil && l2 != nil{

if l1.Val <= l2.Val{

cur.Next = l1

cur = l1

l1 = l1.Next

}else{

cur.Next = l2

cur = l2

l2 = l2.Next

}

}

cur.Next = l1

if l1 == nil {

cur.Next = l2

}

return dummyHead.Next

}

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[链表算法题]http://www.zyiz.net/tech/detail-124357.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值