用我自己编写的sort2()方法,想知道大于7个节点的单链表为啥就不能实现反向排序呢?

class Node{
    Node next;
    int  data;
    
    Node(){}
    Node(int data){
        this.data=data;
    }
}

 class NodeTest{
    static   int[] sz={5,4,3,2,1};
    //生成一个含有5个节点的单链表。
    public Node makList(){      
       Node head=new Node();
       Node tem=head;       
       for(int i=0;i<sz.length;i++){
           Node node=new Node(sz[i]);
           tem.next=node;
           tem=tem.next;
       }
           return head;
   }
   //打印单链表。    
   public void ShowList(Node head){
         Node temp=head.next;
         while(temp!=null){
             System.out.print(temp.data+"  ");
             temp=temp.next;
         }
         System.out.println();
   }
  //为了标记次数,每排序依次,int c加1,c的值在主方法的for循环中增加。
      public void ShowList2(Node head,int c){
         Node temp=head.next;
         
         while(temp!=null){
             System.out.print(temp.data+"  ");
             temp=temp.next;
            
         }
          System.out.print("第 "+c+" 次");
         System.out.println();
   }

    /*这个sort2方法是无意中写的,只增加了一个tem指针,在执行的时候,出现了一些情况:
     *最开始单链表的节点数是5个,顺序是5,4,3,2,1主要是为了方便观察,通过24次遍历
     *得到1,2,3,4,5。于是开始改变节点个数。
     *2个节点(2,1):遍历1次。(第3 、5 、7 、9次也可以)
     *3个节点(3,2,1):遍历4次。(第4 、8 、12 、16次也可以)
     *4个节点(4,3,2,1):遍历9次。(第9 、17 、25 、33次也可以)
     *5个节点(5,4,3,2,1):遍历24次。(第30 、36 、42 、48次也可以)
     *6个节点(6,5,4,3,2,1):遍历25次。(第37 、49 、61 、73次也可以)
     *7个节点(7,6,5,4,3,2,1):遍历多少次都无法实现1,2,3,4,5,6,7的结果。
     *7个节点以后的无论几个节点,都无法实现反向排序。
     *想知道大于7个节点的单链表为啥就不能实现反向排序呢?
     **/
public void sort2(Node head){

         Node pre=head;
         Node cur=pre.next;
         Node tem=cur.next;
         
         while(tem!=null){
             if(pre.data<cur.data){
                 pre.next=cur.next;
                 cur.next=tem.next;
                 tem.next=cur;
                 
                 pre=tem;
                 tem=cur.next;
                 
                 }else{
                     pre=cur;
                     cur=tem;
                     tem=tem.next;
                     }
             }
    }

    public static void main (String[] args) {
             NodeTest nt=new NodeTest();
             Node head=nt.makList();//生成链表,返回头结点。
             int  c=1;
             nt.ShowList(head);//打印单链表。
             System.out.println("修改后");
             for(int i=0;i<80;i++){//int i的大小自己定义,主要是为了便于观察。
             nt.sort2(head);
             nt.ShowList2(head,c);//打印改变后的单链表,并标记第几次遍历。
                  c++;
             }        
    }
    }
 

我觉得排序不用去交换节点,这样麻烦一些,直接交换节点的值data,做起来会简单很多。

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

楼上正解,链表排序直接交换节点值,而不需要改变节点指向

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y