[前端]_一起刷leetcode 86. 分隔链表

136 阅读2分钟

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

题目:

641. 设计循环双端队列

难度中等102收藏分享切换为英文接收动态反馈

设计实现双端队列。
你的实现需要支持以下操作:

  • MyCircularDeque(k):构造函数,双端队列的大小为k。
  • insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。
  • insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。
  • deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。
  • deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。
  • getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。
  • getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。
  • isEmpty():检查双端队列是否为空。
  • isFull():检查双端队列是否满了。

示例:

MyCircularDeque circularDeque = new MycircularDeque(3); // 设置容量大小为3
circularDeque.insertLast(1);			        // 返回 true
circularDeque.insertLast(2);			        // 返回 true
circularDeque.insertFront(3);			        // 返回 true
circularDeque.insertFront(4);			        // 已经满了,返回 false
circularDeque.getRear();  				// 返回 2
circularDeque.isFull();				        // 返回 true
circularDeque.deleteLast();			        // 返回 true
circularDeque.insertFront(4);			        // 返回 true
circularDeque.getFront();				// 返回 4
 

 

提示:

  • 所有值的范围为 [1, 1000]
  • 操作次数的范围为 [1, 1000]
  • 请不要使用内置的双端队列库。

思路:

  1. 第一眼看到题目,我想到的是小于x的值就往前冒泡,大于等于的就往后冒泡;
  2. 但由于这是链表题,冒泡需要不断交换节点的指向,又显得特别麻烦,而且还要求不能改变原来节点的相对位置;
  3. 所以我就想到直接新开两个链表,小于x的放到链表1, 大于等于的放到链表2;
  4. 然后链表1的尾部链接链表2的头部即可。

实现:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} x
 * @return {ListNode}
 */
var partition = function(head, x) {
    // 链表1, 存放值小于x的元素
    let newList1 = new ListNode(0);
    // prev1 指向链表1的末尾节点
    let prev1 = newList1;

    // 链表2, 存放值大于等于x的元素
    let newList2 = new ListNode(0);
    // prev2 指向链表2的末尾节点
    let prev2 = newList2;

    while (head) {
        // 拆断链表,不然会形成闭环
        const next = head.next;
        head.next = null;
        if (head.val < x) {
           prev1.next = head; 
           prev1 = prev1.next;
        } else {
           prev2.next = head; 
           prev2 = prev2.next;
        }

        head = next;
    }

    prev1.next = newList2.next;
    return newList1.next;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。