2024-05-31-代码随想录-Day3-链表

other

Posted by berlinfog on May 31, 2024

链表

今日任务

● 链表理论基础 ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表

详细布置

链表理论基础

建议:了解一下链接基础,以及链表和数组的区别

文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

203.移除链表元素

建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。

题目链接/文章讲解/视频讲解::https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html

707.设计链表

建议: 这是一道考察 链表综合操作的题目,不算容易,可以练一练 使用虚拟头结点

题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html

206.反转链表

建议先看我的视频讲解,视频讲解中对 反转链表需要注意的点讲的很清晰了,看完之后大家的疑惑基本都解决了。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html

代码

结构

go

type ListNode struct{
    val int
    next *ListNode
}

java

public class listnode{
    int val;
    listnode next;
    public listnode(){}
    public listnode(int val){
        this.val = val;
    }
    public listnode(int val,listnode next){
        this.val = val;
        this.next = next;    
    W}
}

移除链表元素

链接 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeElements(head *ListNode, val int) *ListNode {
    temp := &ListNode{}
    temp.Next = head
    ans := temp
    for i :=  head; i != nil; i = i.Next{
        if i.Val == val{
            temp.Next = i.Next
        }else{
            temp.Next = i
            temp = temp.Next
        }
    }
    return ans.Next
}
这边主要是我设定了一个temp作为pre节点,其实优化的话可以让temp来进行遍历,然后判断temp next的值

707.设计链表

建议: 这是一道考察 链表综合操作的题目,不算容易,可以练一练 使用虚拟头结点

题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html
题目链接:https://leetcode.cn/problems/design-linked-list/

tm不写了
// 节点结构体
type Node struct {
    Val int
    Next *Node 
}
// MylinkedList是一个对象,需要去实现LinkedList接口的所有方法
type MyLinkedList struct {
    DummyHead *Node //虚拟头节点
    Size int //链表长度
}

//创建一个链表 
func Constructor() MyLinkedList { //成功
    // 创建一个虚拟头节点,非真正的头节点(真正的头节点是数组第一个节点)
    dummyHead := &Node{
        Val : -1,
        Next : nil,
    }
    return MyLinkedList{DummyHead: dummyHead,Size: 0}
}
// 获取index位置的元素Val
// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
func (this *MyLinkedList) Get(index int) int {
    // 判断index是否非法
    if (index < 0) || (index > (this.Size - 1)) {
        return -1
    }
    // 查找
   var cur *Node = this.DummyHead// dummy节点的index = -1 
	for i := 0;i <= index;i++ {//找到index为 index的节点
        cur = cur.Next //0,1,2,3,4....index
    }
	return cur.Val
}

// 在头节点前面再次添加一个节点
func (this *MyLinkedList) AddAtHead(val int)  { //成功
    // 在dummy节点后面直接添加一个节点
	var newNode *Node = &Node{Val:val, Next:nil,} //所有变量都要显示的初始化
    newNode.Next = this.DummyHead.Next
    this.DummyHead.Next = newNode
    this.Size++
}


// 在尾结点添加节点
func (this *MyLinkedList) AddAtTail(val int)  {
    var newNode *Node = &Node{val, nil}
    cur := this.DummyHead
    for cur.Next != nil { //找到末尾节点
        cur = cur.Next
    }
	cur.Next = newNode //新元素添加到末尾节点后面
    this.Size++
}

// 在index节点前面添加一个节点 
func (this *MyLinkedList) AddAtIndex(index int, val int)  {
    if index > this.Size {
        return
    }else if index == this.Size { //直接添加到末尾
        this.AddAtTail(val) 
        return
    }else if index < 0 {
        index = 0
    }
    var newNode *Node = &Node{val, nil}
    cur := this.DummyHead
    for i:=0; i<=index-1; i++ { //找到index为 index-1的节点,如果index=0,则不会进入循环,直接插入到dummy后面
        cur = cur.Next
    }
    newNode.Next = cur.Next
    cur.Next = newNode
    this.Size++
}
// 删除index节点
func (this *MyLinkedList) DeleteAtIndex(index int)  {
    // 判断是否有效
    if index > this.Size-1 || index < 0 {
        return
    }
    cur := this.DummyHead
    for i := 0; i <= index-1; i++ {
        cur = cur.Next
    }
    cur.Next = cur.Next.Next
    this.Size--
}

// func main(){
//     obj := Constructor()
// 	obj.AddAtHead(1)
// 	obj.AddAtTail(2)
// 	obj.AddAtIndex(0,0)
// 	obj.DeleteAtIndex(0)
// 	fmt.Println(obj.Get(0),obj.Get(1),obj.Get(2))
	
// }

206.反转链表

建议先看我的视频讲解,视频讲解中对 反转链表需要注意的点讲的很清晰了,看完之后大家的疑惑基本都解决了。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html
leetcode :https://leetcode.cn/problems/reverse-linked-list/

题意:反转一个单链表。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL


/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
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
}

func reverseList(head *ListNode) *ListNode {
   var prev *ListNode = nil
   cur := head
   nex := head
   for cur != nil{
    nex = cur.Next
    cur.Next = prev
    prev = cur
    cur = nex
   }
   return prev
}