[路飞]_leetcode 19. 删除链表的倒数第 N 个结点、leetcode 83.删除排序链表中的重复元素

433 阅读1分钟

「这是我参与11月更文挑战的第 7 天,活动详情查看:2021最后一次更文挑战

题目1

题目来源:LeetCode-19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

###示例 1:

image.png

输入: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指针,

image.png

  • 使cur指针往前移动一位。

image.png

  • 重复执行上述操作,n次。

image.png

  • 同时移动 precur指针。

image.png

  • 重复执行上述操作,直到cur指针指向null

image.png

  • 使pre指针所指向pre指针下一个的一下节点,这样就能把待删除的节点给删除掉。

image.png

代码实现

/**
 * @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节点

image.png

判断temp指针所指节点的值与当前节点的下个节点的值是否一样

image.png

一样的话就使temp指针所指的节点指向当前节点下一个的下一个,否则进行往后移动

image.png

重复执行上述操作,直到temp指针所指的下一个节点为null

image.png

代码实现

/**
 * @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
};