循环双向链表的三切,Java

Triple-cut of a circular doubly linked list, Java

给定一个循环双向链表deck(拥有字段head),它有节点card(拥有字段nextprev),我想要在牌组上进行“三次切割”,定义为在牌组中选取两张牌,并将第一张牌之前的元素替换为第二张牌之后的元素。方法必须是 O(1).

我的想法是生成两个新的循环双向链表 deck1 和 deck2 并将甲板的左侧部分和右侧部分存储在其中,respectively.I 制作了以下图片以更好地解释我正在尝试的内容实现:

下面是我的编码尝试,当尝试切片 'this' 牌组,并以适当的顺序将切片的牌组与新的 2 副牌重新组合时,问题就出现了。

public void tripleCut(Card firstCard, Card secondCard) {
    
    
    // inputs : firstCard = 3H 
    // inputs : secondCard = 2C
    
        // this deck : AC 2D 3H 4D AD 4H 4C AH 2C RJ 3C BJ 3D 2H 

    // deck 3
    Deck d3 = new Deck();
    d3.head = secondCard.next;
    secondCard = d3.head.prev;
    d3.head.prev = this.head.prev;
    
        // d3.head = RJ 
        // d3.head.prev = 2H
    
    //deck 1
    Deck d1 = new Deck();
    d1.head = this.head;
    d1.head.prev = firstCard.prev;

        // d1.head = AC 
        // d1.head.prev = 2D
    
    // Slicing the two decks from 'this' deck

    this.head.prev = secondCard;
    secondCard.next = this.head;
    
    this.head = firstCard;
    firstCard.prev = secondCard;
    this.head.prev = secondCard;
    secondCard.next= this.head;
    
    head.prev.next=d1.head;
    head.prev = d1.head.prev;

}

当我尝试重新组合套牌时,我得到了废话,这表明我上面所做的是不正确的。你们将如何解决这个问题?即使是伪代码也会 hewlp,我已经坚持了很长时间我真的迷路了。

澄清个案

  1. 左 = 空 and/or 右 = 空
  2. 左==右==头
  3. 左边永远在右边

基本思路

剪切

假设 head 是可访问的并且 left/right 顺序得到维护

  1. 三个参数-头、左、右
  2. 导出尾部=head.prev
  3. 备份 beforeLeft = left.prev 和 afterRight = right.next
  4. 切尾,头循环(tail.next = head.prev = null)
  5. 剪切 left.prev = right.next = 空,beforeLeft.next = 空,afterRight.prev = 空

加入

  1. 六个参数——head, tail, left, right, beforeLeft, afterRight
  2. 头部会向右移动(right.next = 头部,head.prev = 右侧)
  3. 尾巴会先于左手移动(left.prev = 尾巴,tail.next = 左手)
  4. 设置新的头部和尾部(head = afterRight,tail = beforeLeft)
  5. 加入新的头部和尾部(head.prev = 尾部,tail.next = 头部)

我还没有测试过这个及其可能的方法之一。