Day3 leetcode 203,206,237,707还没整体逻辑

203. 移除链表元素

题目 :
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点
示例 1:
输入: head = [1,2,6,3,4,5,6], val = 6
输出: [1,2,3,4,5]
示例 2:
输入: head = [], val = 1
输出: []
示例 3:
输入: head = [7,7,7,7], val = 7
输出: []
思路:
首先是要记住如何构造一个链表,JS 构造方式

  function ListNode(val, next) {
     this.val = (val===undefined ? 0 : val)
     this.next = (next===undefined ? null : next)
}

接着,有两种删除链表方法,分别是直接删除和采用虚拟头节点来删除,由于 JS 定义的链表默认可以填入 headhead. next,所以采用虚拟头节点来删除。其次,要定义一个指针用来指向实例对象 result,设为 curcurresult 共享一个实例对象,内存地址相同。接着,先要判断 cur. next 是否有值,以防空指针操作,然后通过 cur. next. val===val 的判断来是否要删除节点,之后通过将 cur. next 的指针指向 cur. next. next 来实现节点的删除,如果不是要删除的节点,则要将 cur 移向 cur. next,由于整体的逻辑是一个不断执行的操作,所以循环体采用 while

var removeElements = function(head, val) {
    let result = new ListNode(0,head)
    let cur = result
    while(cur.next !== null){
        if(cur.next.val === val){
            cur.next = cur.next.next
        }else{
            cur = cur.next
        }
    }
    return result.next
};

707. 设计链表

(待补充)

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入: head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入: head = [1,2]
输出:[2,1]
示例 3:
输入: head = []
输出:[]
思路:
双指针法
采用两个指针来进行遍历,第一个 cur 指向当前链表的头节点,第二个指针 pre 初始值为 null,因为 cur 的指向的头节点最后会因为链表的反转变成为尾节点,最后会指向 null。接着,每进行一次反转,都需要将两个节点向前移动,并且重新赋值,需要将 cur 指向它的下一个节点 cur. nextpre 需要指向移动前的 cur,所以需要一个中间节点来存储 cur. next ,并根据顺序进行重新赋值,根据 cur 是否指向 null 来判断循环的结束,由于当 cur 指向 null 的时候,pre 指向的“尾节点”在这个时候就是头节点,所以 return pre 即可。

var reverseList = function(head) {
	let dummyhead = new ListNode(0,head) // 必须用dummyhead才能进行第一个节点的操作
	cur = dummyhead.next
	let pre = null
	while(cur){
		let temp = cur.next
		cur.next = pre
		pre = cur
		cur = temp
	}
	return pre
};

递归法
方法和双指针法差不多,只是要创建一个新的函数。在函数中要进行 cur 的判断,如果 cur 为 null 要 return pre,递归是要不断 return 才能产生递归,如果没有 return

functon reverse(cur,pre){
	if(cur===null) return pre
	let temp = cur.next
	cur.next = pre
	return reverse(temp,cur)
}
var reverseList = function(head) {
	let cur =  new ListNode(0,head)
	cur = cur.next
	reverse(cur,null)
};

237. 删除链表中的节点

题目:
有一个单链表的 head,我们想删除它其中的一个节点 node
给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head
链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

  • 给定节点的值不应该存在于链表中。
  • 链表中的节点数应该减少 1。
  • node 前面的所有值顺序相同。
  • node 后面的所有值顺序相同。
    自定义测试:
  • 对于输入,你应该提供整个链表 head 和要给出的节点 nodenode 不应该是链表的最后一个节点,而应该是链表中的一个实际节点。
  • 我们将构建链表,并将节点传递给你的函数。
  • 输出将是调用你函数后的整个链表。
  • 示例 1:
    输入: head = [4,5,1,9], node = 5
    输出: [4,1,9]
    解释: 指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9
    示例 2:
    输入: head = [4,5,1,9], node = 1
    输出:[4,5,9]
    解释: 指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
var deleteNode = function(node) {
    node.val =node.next.val
    node.next = node.next.next
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值