漫画:如何将一个链表“逆序”?

 

 

—————  第二天  —————

 

 

 

 

 

 

 

(现实里的小灰在刚入行的时候,面试官也问了我这个问题,当时小灰就傻傻的问面试官是单链表还是双链表?然后就没然后了......)

 

 

 

————————————

 

 

 

 

 

 

 

 

 

 

 

 

 

让我们从链表头部开始,建立三个临时节点的引用,分别为p1,p2,p3。它们分别指向头节点、第二个节点、第三个节点。

 

 

实现链表逆序的完整步骤如下:

 

1.以p2节点为视角,把p2节点原本指向p3的next指针倒转,指向p1。

 

 

2.三个临时节点引用p1,p2,p3分别向后移动一格位置。

 

 

 

3.重复第1步的工作,以p2节点为视角,把p2节点原本指向p3的next指针倒转,指向p1。

 

 

4.重复第2步的工作,三个临时节点引用p1,p2,p3分别向后移动一格位置。

 

 

 

.......

.......

 

5.继续像这样子迭代下去,一直到p2是空为止。

 

 

6.最后,把head节点的next指向空,成为逆序链表的尾节点。并且把p1赋值给head,让p1所在的节点成为逆序链表的头节点。

 

 

  1. private static Node head;

  2.  

  3.  

  4. public static void reverseLinkedList(){

  5.    if(head==null || head.next==null){

  6.        return;

  7.    }

  8.  

  9.    Node p1 = head;

  10.    Node p2 = head.next;

  11.    Node p3 = null;

  12.  

  13.    while (p2!=null){

  14.        p3 = p2.next;

  15.        p2.next = p1;

  16.        p1 = p2;

  17.        p2 = p3;

  18.    }

  19.  

  20.    head.next = null;

  21.    head = p1;

  22. }

  23.  

  24.  

  25. private static class Node {

  26.    int data;

  27.    Node next;

  28.  

  29.    Node(int data) {

  30.        this.data = data;

  31.    }

  32. }

  33.  

  34.  

  35. public static void main(String[] args){

  36.    //初始化链表

  37.    head = new Node(3);

  38.    head.next = new Node(5);

  39.    Node temp = head.next;

  40.    temp.next = new Node(1);

  41.    temp = temp.next;

  42.    temp.next = new Node(4);

  43.    temp = temp.next;

  44.    temp.next = new Node(9);

  45.  

  46.    //逆序前输出链表

  47.    temp = head;

  48.    while(temp!=null){

  49.        System.out.println(temp.data);

  50.        temp = temp.next;

  51.    }

  52.  

  53.    //逆序链表

  54.    reverseLinkedList();

  55.  

  56.    //逆序后输出链表

  57.    temp = head;

  58.    while(temp!=null){

  59.        System.out.println(temp.data);

  60.        temp = temp.next;

  61.    }

  62. }

 

链表反转的逻辑本身,都在reverseLinkedList方法当中。在这里我们把链表的头节点作为了静态成员,实际上也可以作为方法参数传入,只是逻辑上需要一些小小的修改。

 

 

 

 

喜欢本文的朋友们,欢迎长按下图关注公众号 程序员小灰,收看更多精彩内容

 

posted on 2019-03-01 11:14  程序员小灰  阅读(243)  评论(0)    收藏  举报

导航