【问题标题】:get pointer to object which is persitent获取指向持久对象的指针
【发布时间】:2011-04-27 10:40:18
【问题描述】:

我有一个包含许多列表元素的双链表。所以我可以使用 item.next、item.prev 等等......(比如 item.next.prev.prev.next.prev 也可以) 我想交换两个项目,所以首先我需要存储项目 A 的下一个和上一个:

Item aprev = a.prev;
Item anext = a.next;

现在我想把 b 换成 a:

a.next = b.next;
a.prev = b.prev;
a.next.prev = a;
a.prev.next = a;

现在我需要将 a 换成 b,所以我使用以前保存的项目:

b.next = aprev;
b.prev = anext;
...

现在我遇到了问题! aprev 是 a.prev 现在是 b.prev!所以项目循环到他自己的......

我能做些什么来交换这些元素?我需要某种临时项目,但是当我覆盖它时指向对象的指针消失了怎么办?

【问题讨论】:

    标签: java pointers object linked-list


    【解决方案1】:
    temp = a.prev;
    a.next = b.next;
    a.prev = b;
    b.next = a;
    b.prev = temp;
    

    会的。

    【讨论】:

      【解决方案2】:

      基本上你会有两个交换操作,一个用于 prev 指针,一个用于 next 指针:

      swapPrevPointer(a,b);
      swapNextPointer(a,b);
      

      private swapPrevPointer(Item a, Item b) {
         Item temp = a.prev;
         a.prev = b.prev;
         b.prev = temp;
      }
      
      private swapNextPointer(Item a, Item b) {
         Item temp = a.next;
         a.next = b.next;
         b.next = temp;
      }
      

      视觉解释

      初始列表:

      null <--ap-- A --an--> B --bn--> C 
                     <--bp--  
      

      交换后:

      null <--ap-- B --an--> A --bn--> C 
                     <--bp--  
      

      必要的改变

      B.prev <- ap ____ swapping "prev" pointers
      A.prev <- bp _/
      B.next <- an ____ swapping "next" pointers
      A.next <- bn _/
      

      【讨论】:

      • 对它作为两个谨慎的操作表示赞许,因为我觉得它不那么令人困惑......因为我真的不是很聪明;-) 说真的,六个 prev 和 next 的上下文 AT ONCE 让我感到困惑完全。
      • 哇,谢谢,必须试试这个.. 但是我的问题是什么?是因为我做了两个临时变量吗?
      • @reox - 在你的最后几行中应该是:b.prev = aprev;b.next = anext;。您必须严格交换 next 和 prev 指针 - 没有“交​​叉交换”。
      猜你喜欢
      • 2015-03-10
      • 1970-01-01
      • 2016-02-25
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2012-02-10
      相关资源
      最近更新 更多