【问题标题】:How to Reverse a linked list in java while preserving the original order?java - 如何在保留原始顺序的同时在java中反转链表?
【发布时间】:2022-01-25 08:10:07
【问题描述】:

我想反转一个链表。我可以反转列表,但这样做也会影响原始列表。如何在使用显示功能时同时查看原始链表和反向链表?

要求以下代码库...

请帮忙看看 display 和 reverseLink 方法。也添加了所有其他类。

public class Node {
    int data;
    Node link;

    public Node(int data, Node link) {
        this.data = data;
        this.link = link;
    }
    
    public Node() {
        this.data = 0;
        this.link = null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getLink() {
        return link;
    }

    public void setLink(Node link) {
        this.link = link;
    }
}
public class Sa_LinkedList {

    Node start;
    Node end;
    int size;
    public Sa_LinkedList() {
        start=null;
        end=null;
        size=0;
    }
    
    public boolean isEmpty() {
        return start==null;
    }

    public int getSize() {
        return size;
    }
    
    public void insertAtStart(int val) {
        Node newNd=new Node(val,null);
        size++;
        
        if(start==null) {
            start=newNd;
            end=start;
        }
        else
        {
            newNd.setLink(start);
            start=newNd;
        }
    }
    
    public void insertAtEnd(int val) {
     Node newNd=new Node(val,null);
     size++;
    
     if(end==null) {
         end=start=newNd;
     }
     else {
         end.setLink(newNd);
         end=newNd;
     }
    }

        public void insertAtPos(int val,int pos) {
            Node newNd=new Node(val,null);
            Node ptr=start;
            pos=pos-1;
            for(int i=0;i<size;i++) {
                
                if(i==pos) {
                Node temp=ptr.getLink();
                ptr.setLink(newNd);
                newNd.setLink(temp);
                break;
                }
                ptr=ptr.getLink();
            }
            size++;
        }
            
        
        public void deleteAtPos(int pos) {
    
            if(pos==1) {
                start=start.getLink();
                size--;
                return;
            }
            if(pos==size) {
              Node s=start;
              Node t=start;
              
              while(t!=end) {
                  s=t;
                  t=t.getLink();
              }
              end=s;
              end.setLink(null);
              size--;
              return;
              
            }
            Node ptr=start;
            pos=pos-1;
            for(int i=0;i<size;i++) {
                if(i==pos) {
                    Node temp=ptr.getLink();
                    temp=temp.getLink();
                    ptr.setLink(temp);
                    break;
                }
                ptr=ptr.getLink();
            }
            size--;
        }
 
    //*Function for displaying the linkedlist
    public void display() {
        System.out.println("Displaying the linkedlist elements:");
        Node ptr=start;
    
        if (size==0)
        {
            System.out.println("sorry...------List is empty------");
            return;
        }
        if(start.getLink()==null)
        {
            System.out.println(start.getData());
            return;
        }
        while(ptr.getLink()!=null) {
            System.out.println(ptr.getData()+",");
            ptr=ptr.getLink();
        }
        System.out.println(ptr.getData()+"\n");
    }
    
    
    public void reverseLink() {
        Node current=start;
        Node next=null;
        Node prev=null;
        
        while(current!=null) {
            
            next=current.getLink();
            current.setLink(prev);
            prev=current;
            current=next;
        }
        start=prev;
    }
}

【问题讨论】:

  • 您的任务是在不修改列表的情况下以相反的顺序显示列表吗?
  • 我想你在这里要理解的是可变性的概念。你 Node 对象是可变的,所以如果你修改它们,你就会失去状态。您可以使用不可变的Nodes 来获得反向链表和原始链表,这实际上意味着您正在创建一个副本。

标签: java collections linked-list


【解决方案1】:

JDK 中有Collections.reverse(List) 方法可用。您可以以它的方法为例:

public static void reverse(List<?> list) {
    int size = list.size();
    if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
        for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
            swap(list, i, j);
    } else {
        // instead of using a raw type here, it's possible to capture
        // the wildcard but it will require a call to a supplementary
        // private method
        ListIterator fwd = list.listIterator();
        ListIterator rev = list.listIterator(size);
        for (int i=0, mid=list.size()>>1; i<mid; i++) {
            Object tmp = fwd.next();
            fwd.set(rev.previous());
            rev.set(tmp);
        }
    }
}

【讨论】:

    【解决方案2】:
    1. 复制列表并反转一个或
    2. 或建立一个双向链表。在双向链表中,每个节点都知道它的前一个节点和下一个节点。有了这个,您可以轻松地以相反的顺序打印列表

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 1970-01-01
      • 2023-04-05
      • 2015-06-30
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多