简体   繁体   English

将单链表转换为双链表

[英]Converting a Single Linked List to a Double Linked List

I have here a single linked list for a program that makes a collage. 我在这里有一个制作拼贴画的程序的链接列表。 This runs perfectly but I was wondering how to make it a double linked list. 这运行得很好,但我想知道如何使其成为双链表。 I really have no idea what a double linked is though or how to create one. 我真的不知道什么是双向链接,或者如何创建双向链接。 Any help would be appreciated... 任何帮助,将不胜感激...

There are 3 classes. 有3个班级。

class LinearCollage
{
  private Picture myArray[];
  private class Node
  {
    Picture data;
    Node pNext;
  };

  private Node pFirst;
  private Node pLast;

  private int nPictures;  
  private Picture clipboard;
  public LinearCollage()
  {
    pFirst = null;
    pLast = null;
    nPictures = 0;

  }
  public void addPictureAtEnd(Picture aPictureReference)
  {
    Node temp = new Node();
    temp.data = aPictureReference;
    temp.pNext = null;
    if( pLast == null )
    {
      pLast = temp;
      pFirst = temp;
    }
    else
    {
      pLast.pNext = temp;
      pLast = temp;
    }
    nPictures++;
  }
  public Picture makeCollage()
  {
    int collageHeight = 400;
    int collageWidth = 400;
    for( Node finger = pFirst; finger != null; finger = finger.pNext )
    {
      System.out.println("Process Picture " + finger.data);
    }
    Picture retval = new Picture(collageHeight,collageWidth);
    int i = 0;
    for( Node finger = pFirst; finger != null; finger = finger.pNext )
    {
      System.out.println("Process Picture " + finger.data);
      finger.data.compose(retval, 50*i, 50*i);
      i++;
    }
    return retval;
  }
  public void cutMiddle()
  {
    int cutIndex = nPictures-1;
    clipboard = myArray[cutIndex];
    for( int i = cutIndex; i < nPictures - 1; i++ )
    {
      myArray[i] = myArray[i + 1];
    }
    nPictures--;
  }
  public void cutEnd()
{
int cutIndex = nPictures;
clipboard = myArray[cutIndex];
for( int i = cutIndex; i<nPictures - 1; i++)
{
myArray[i] = myArray[i + 1];
}
nPictures--;
}
public void pasteEnd()
{
myArray[nPictures] = clipboard;
nPictures++;
}
  public boolean isFull()
  {
    return false;
  }
  public boolean isEmpty()
  {
    return nPictures == 0;
  }
}

import java.util.Scanner;
class LineCollageMaker
{
  public static void main(String a[])
  {
    LinearCollage myCollage;
    Scanner uiInput = new Scanner(System.in);


    myCollage = new LinearCollage();

    FileChooser.pickMediaPath();
    boolean inputting = true;
    while( inputting ) 
    {
      System.out.println("Another picture? Type Y if so.");
      String answer = uiInput.next();
      if(answer.equals("Y"))
      {
        Picture pin = new Picture(FileChooser.pickAFile());
        myCollage.addPictureAtEnd(pin);
      }
      else
      {
        inputting = false;
      }


    }
    Picture firstToShow = myCollage.makeCollage();
    firstToShow.show();
    //YOU Code the user inteface loop and dispatch to methods
    //of myCollage here..
    boolean done = false;
   while( !done )
    {
      System.out.println("MENU (CASE SENSITIVE!)");
      System.out.println("CM - cut middle and move it to the clipboard");
      System.out.println("PE - paste clipboard to end");
      System.out.println("CE - cut end and move it to clipboard");
      System.out.println("XX - stop running this program");
      String command = uiInput.next();
      if(command.equals("XX"))
        done = true;
      else if(command.equals("CM"))
      {
        if(myCollage.isEmpty())
        {
          System.out.println("Can't cut from an empty collage.");
        }
        else
        {
          myCollage.cutMiddle();
          myCollage.makeCollage().show();
        }
      }
      else if(command.equals("PE"))
      {
        if(myCollage.isFull())
        {
          System.out.println("Can't paste to an empty collage.");
        }
        else
        {
         myCollage.pasteEnd();
         myCollage.makeCollage().show();
        }
      }
        else if(command.equals("CE"))
      {
        if(myCollage.isEmpty())
        {
          System.out.println("Can't copy from an empty collage.");
        }
        else
        {
         myCollage.cutEnd();
         myCollage.makeCollage().show(); 
        }
      }
      else
        System.out.println("Unrecognized command. Try again.");
    }

  }
}



public class Node
{
  //le class variables
  private Picture myPic;
  private Node next;

  //le constructors  
  public Node(Picture heldPic)
  {
    myPic=heldPic;
    next=null;
  }

  public void setNext(Node nextOne)
  {
    this.next=nextOne;
  }
  public Node getNext()
  {
   return this.next; 
  }
  public Picture getPicture()
  {
   return this.myPic; 
  }


  //le methods
  public void drawFromMeOn(Picture bg)
  {
   Node current;
   int currentX=0, currentY=bg.getHeight()-1;

   current = this;
   while (current != null)
   {
    current.drawMeOn(bg,currentX, currentY);
    currentX = currentX + current.getPicture().getWidth();
    current=current.getNext();
   }
  }

 private void drawMeOn(Picture bg, int left, int bottom)
 {
  this.getPicture().blueScreen(bg, left, bottom-this.getPicture().getHeight());
 }
}

A doubly linked list is simply a linked list where every element has both next and prev mebers, pointing at the elements before and after it, not just the one after it in a single linked list. 双链表只是一个链表,其中每个元素都具有下一个和上一个元素,指向其前后的元素,而不仅仅是单个链表中位于其后的元素。

so to convert your list to a doubly linked list, just change your node to be: 因此,要将您的列表转换为双向链接列表,只需将您的节点更改为:

private class Node
  {
    Picture data;
    Node pNext;
    Node pPrev;
  };

and when iterating the list, on each new node add a reference to the previous node. 当迭代列表时,在每个新节点上添加对先前节点的引用。

A doubly-linked list takes a singly-linked list one step further by also having a reference to the previous node, rather than just the next one. 双链列表通过单引用链表更进一步,它也引用了前一个节点,而不仅仅是下一个节点。

I confess I am slightly confused by your code as it looks like you have a private class for Node and then another public class for it. 我承认我对您的代码感到有些困惑,因为您看起来像对Node拥有一个私有类,然后为它拥有另一个公共类。 To make this a doubly-linked list add another Node instance variable into your Node class which references the previous node, and then update this variable when you add in new nodes. 为了使它成为一个双向链接的列表,请在引用先前节点的Node类中添加另一个Node实例变量,然后在添加新节点时更新此变量。

You can convert Single linked list to Double linked list via a concept called XOR based linked list. 您可以通过称为基于XOR的链表的概念将单链表转换为双链表。 The beauty of XOR truth table makes suitable for this use case. XOR真值表的优点使其适用于此用例。

Check this out : https://www.geeksforgeeks.org/xor-linked-list-a-memory-efficient-doubly-linked-list-set-1/ 检查一下: https : //www.geeksforgeeks.org/xor-linked-list-a-memory-efficiency-doubly-linked-list-set-1/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM