循环双向链表的三切,Java
Triple-cut of a circular doubly linked list, Java
给定一个循环双向链表deck
(拥有字段head
),它有节点card
(拥有字段next
和prev
),我想要在牌组上进行“三次切割”,定义为在牌组中选取两张牌,并将第一张牌之前的元素替换为第二张牌之后的元素。方法必须是 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,我已经坚持了很长时间我真的迷路了。
澄清个案
- 左 = 空 and/or 右 = 空
- 左==右==头
- 左边永远在右边
基本思路
剪切
假设 head 是可访问的并且 left/right 顺序得到维护
- 三个参数-头、左、右
- 导出尾部=head.prev
- 备份 beforeLeft = left.prev 和 afterRight = right.next
- 切尾,头循环(tail.next = head.prev = null)
- 剪切 left.prev = right.next = 空,beforeLeft.next = 空,afterRight.prev = 空
加入
- 六个参数——head, tail, left, right, beforeLeft, afterRight
- 头部会向右移动(right.next = 头部,head.prev = 右侧)
- 尾巴会先于左手移动(left.prev = 尾巴,tail.next = 左手)
- 设置新的头部和尾部(head = afterRight,tail = beforeLeft)
- 加入新的头部和尾部(head.prev = 尾部,tail.next = 头部)
我还没有测试过这个及其可能的方法之一。
给定一个循环双向链表deck
(拥有字段head
),它有节点card
(拥有字段next
和prev
),我想要在牌组上进行“三次切割”,定义为在牌组中选取两张牌,并将第一张牌之前的元素替换为第二张牌之后的元素。方法必须是 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,我已经坚持了很长时间我真的迷路了。
澄清个案
- 左 = 空 and/or 右 = 空
- 左==右==头
- 左边永远在右边
基本思路
剪切
假设 head 是可访问的并且 left/right 顺序得到维护
- 三个参数-头、左、右
- 导出尾部=head.prev
- 备份 beforeLeft = left.prev 和 afterRight = right.next
- 切尾,头循环(tail.next = head.prev = null)
- 剪切 left.prev = right.next = 空,beforeLeft.next = 空,afterRight.prev = 空
加入
- 六个参数——head, tail, left, right, beforeLeft, afterRight
- 头部会向右移动(right.next = 头部,head.prev = 右侧)
- 尾巴会先于左手移动(left.prev = 尾巴,tail.next = 左手)
- 设置新的头部和尾部(head = afterRight,tail = beforeLeft)
- 加入新的头部和尾部(head.prev = 尾部,tail.next = 头部)
我还没有测试过这个及其可能的方法之一。