「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战」
题目1
题目来源:LeetCode-82. 删除排序链表中的重复元素II
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
0 <= Node.val <= 100\
提出问题
- 链表进行节点删除操作?
分析
- 定义
pre指针,指向虚拟头节点,定义cur指针,指向head节点
- 判断
cur指针所指向节点的内容与当前节点下一个节点的内容是否一样,不一样的pre与cur同时往后移一位。
- 再次判断
cur指针所指向节点的内容与当前节点下一个节点的内容是否一样,一样的话cur指针往后移一位
- 重复执行,当
cur指针所指向节点的内容与当前节点下一个节点的内容不一样时,让pre指针所指向节点指向cur指针所指向的下一个节点。
- 同时移动
pre、cur指针到cur下一个节点
-
重复执行上述操作,直至
cur所指向节点的下一个节点为null。 -
整理一下
代码实现
/**
* @param {ListNode} head
* @return {ListNode}
*/
var deleteDuplicates = function(head) {
if (!head) return null
let ret = new ListNode(-1,head)
let pre = ret
let cur = head
while(cur && cur.next){
if(cur.next.val !== cur.val){
cur = cur.next
pre = pre.next
}else{
while(cur && cur.next && cur.val === cur.next.val){
cur = cur.next
}
pre.next = cur.next
cur = cur.next
}
}
return ret.next
};
题目2
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
分析
- 遍历链表,通过
unshift方法插入数组里面(方法将新项添加到数组的开头,并返回新的长度)
代码实现
/**
* @param {ListNode} head
* @return {number[]}
*/
var reversePrint = function (head) {
let arr = []
let temp = head
while(temp !== null) {
arr.unshift(temp.val)
node = temp.next
}
return arr
}