「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战」
题目1
题目来源:LeetCode-19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
###示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
提出问题
- 链表进行节点删除操作?
分析
- 定义pre指针,指向虚拟头节点,定义cur指针,
- 使
cur
指针往前移动一位。
- 重复执行上述操作,
n
次。
- 同时移动
pre
、cur
指针。
- 重复执行上述操作,直到
cur
指针指向null
。
- 使
pre
指针所指向pre
指针下一个的一下节点,这样就能把待删除的节点给删除掉。
代码实现
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
if(!head) return null
let ret = new ListNode(-1,head)
let pre = ret
let cur = head
while(n--) cur = cur.next
while(cur){
pre = pre.next
cur = cur.next
}
pre.next = pre.next.next
return ret.next
};
题目2
题目来源:LeetCode-83. 删除排序链表中的重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。 返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
提出问题
- 如何判断列表俩个的节点是否相同?
分析
初始化temp
指针指向head
节点
判断temp
指针所指节点的值与当前节点的下个节点的值是否一样
一样的话就使temp
指针所指的节点指向当前节点下一个的下一个,否则进行往后移动
重复执行上述操作,直到temp
指针所指的下一个节点为null
代码实现
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
var removeNthFromEnd = function(head, n) {
if(!head) return null
let ret = new ListNode(-1,head)
let pre = ret
let cur = head
while(n--) cur = cur.next
while(cur){
pre = pre.next
cur = cur.next
}
pre.next = pre.next.next
return ret.next
};