[路飞]_leetcode leetcode 82.删除排序链表中的重复元素II、剑指 Offer 06. 从尾到头打印链表

471 阅读1分钟

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

题目1

题目来源:LeetCode-82. 删除排序链表中的重复元素II

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例 1:

image.png

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]

示例 2:

image.png

输入:head = [1,1,1,2,3]
输出:[2,3]

 

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
0 <= Node.val <= 100\

提出问题

  • 链表进行节点删除操作?

分析

  • 定义pre指针,指向虚拟头节点,定义cur指针,指向head节点

image.png

  • 判断cur指针所指向节点的内容与当前节点下一个节点的内容是否一样,不一样的precur同时往后移一位。

image.png

  • 再次判断cur指针所指向节点的内容与当前节点下一个节点的内容是否一样,一样的话cur指针往后移一位

image.png

  • 重复执行,当cur指针所指向节点的内容与当前节点下一个节点的内容不一样时,让pre指针所指向节点指向cur指针所指向的下一个节点。

image.png

  • 同时移动 precur指针到cur下一个节点

image.png

  • 重复执行上述操作,直至cur所指向节点的下一个节点为null

  • 整理一下

image.png

代码实现

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

题目来源:剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 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
}