代码随想录35期Day03-链表

203. 移除链表元素

  • 递归方法
func removeElements(head *ListNode, val int) *ListNode {
    if head == nil {
        return head
    }
    head.Next = removeElements(head.Next, val)
    if head.Val == val {
        return head.Next
    }
    return head
}
  • 非递归
func removeElements(head *ListNode, val int) *ListNode {
	node := head // 定一个游标头节点
	for node.Next != nil {
		if node.Next.Val == val {
			temp := node.Next
			node.Next = temp.Next
		}
		node = node.Next // 油标后移
	}
	return head
}

链表的工具方法

// 链表定义
type ListNode struct {
	Val  int
	Next *ListNode
}

// 数组转链表的工具
func createLinkedList(values []int) *ListNode {
	head := &ListNode{}
	curr := head

	for _, val := range values {
		curr.Next = &ListNode{Val: val}
		curr = curr.Next
	}

	return head.Next
}
// 链表转数组
func ListNode2arr(head *ListNode) []any {
	var res []any
	node := &ListNode{-1, head} // 定一个油标头节点
	for node.Next != nil {
		res = append(res, node.Next.Val)
		node = node.Next
	}
	return res
}

707. 设计链表


// 单链表
type MyLinkedList struct {
	val  int           // 节点值
	next *MyLinkedList // 下一个节点指针
	//prev *MyLinkedList // 上一个节点指针
}

var head MyLinkedList // 头节点
var length int

func Constructor() MyLinkedList {
	head = MyLinkedList{}
	length = 0
	return head // 返回一个头节点
}

func (this *MyLinkedList) Get(index int) int {
	if index >= length || index < 0 {
		return -1
	}
	node := this
	for i := 0; i < index; i++ {
		node = node.next
	}
	return node.next.val
}

func (this *MyLinkedList) AddAtHead(val int) {
	temp := this.next
	newNode := MyLinkedList{val: val, next: temp}
	this.next = &newNode
	length++
}

func (this *MyLinkedList) AddAtTail(val int) {
	newNode := MyLinkedList{val: val, next: nil}
	node := this
	for node.next != nil {
		node = node.next
	}
	node.next = &newNode
	length++
}

func (this *MyLinkedList) AddAtIndex(index int, val int) {
	// 合法检测
	if index > length || index < 0 {
		return
	}
	if index == length {
		this.AddAtTail(val)
		return
	}

	// 找到下标为index的节点
	cur := this
	for i := 0; i < index; i++ {
		cur = cur.next
	}

	// 头插
	newNode := MyLinkedList{val: val, next: cur.next}
	cur.next = &newNode
	length++
}

func (this *MyLinkedList) DeleteAtIndex(index int) {
	// 合法检测
	if index >= length || index < 0 {
		return
	}
	node := this
	for i := 0; i < index; i++ {
		node = node.next
	}
	temp := node.next
	node.next = temp.next

	length--
}

206. 反转链表

  • 头插法(原地逆转)
func headInsert(head *ListNode, node *ListNode) {
    node.Next = head.Next
    head.Next = node
}

func reverseList(head *ListNode) *ListNode {
    var newHead ListNode
    cur := head // 游标

    for cur != nil {
        temp := cur
        cur = cur.Next
        headInsert(&newHead, temp)
    }
    return newHead.Next
}
  • 递归(栈)
    在这里插入图片描述
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    newHead := reverseList(head.Next)
    head.Next.Next = head
    head.Next = nil
    return newHead

}
  • 新节点复制
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手八嘎呀路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值