单链表反转

**

背景

**
链表是面试中经常被问到的面试题。原因有两方面:一是大量的基本类库设计采用了链表作为底层的数据结构,二是链表的操作能体现出一个程序员的基本功。

  闲话少说,直奔主题:
  输入一个链表,输出链表的反转。
  例子:
  输入 :  1->2->3->4->5->null
  输出 :  5->4->3->2->1->null

第一步:单链表反转_第1张图片
如图所示,初始化三个指针。cur:正在遍历节点元素的指针。prev:遍历节点元素之前的指针。next:遍历节点元素之后的指针

第二步:

单链表反转_第2张图片
(1)现将next的指针指向cur的next节点(原来next指针指向null):next = cur.next .此时next指针指向2
(2)此时cur的指向节点还是节点1,再将节点1的next的指针指向prev指向的节点:cur.next = prev. 此时cur.next指向null
(3)将prev指向的节点由节点null指向节点1:prev=cur.此时prev和cur都指向节点1
(4)将cur指向的节点由节点1指向节点2:cur = next.此时cur和next都指向节点2

第三部:
这个步骤和之前类似
.
.
.
递归循环

**

代码实现

**

/**
 * author : panther
 * date : 2020/4/10
 */
public class NodeLinkPractice {

    public static void main(String[] args) {
        Node node5 = new Node(5, null);
        Node node4 = new Node(4, node5);
        Node node3 = new Node(3, node4);
        Node node2 = new Node(2, node3);
        Node node1 = new Node(1, node2);

        Node result = reverseLink(node1);


        while (result!=null){
            System.out.print(result.value + " ");
            result = result.next;
        }
        System.out.println();
    }

    private static Node reverseLink(Node head) {
        Node prev = null;
        Node cur = head;
        Node next = null;
        while (cur != null) {
            next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }

}

class Node {
    int value;
    Node next;

    public Node(int value, Node next) {
        this.value = value;
        this.next = next;
    }
}

我对此段代码记忆总结了一个巧妙的方法:2,3,4方法
2:初始化两个字段为空。分别是prev=null和next=null
3:初始化三个字段。分别是prev=null,cur=head,next=null
4:while循环中由四行代码:
分别是: next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
我不提倡背代码,但是面试时紧张的时候很容易把指针操作的思路搞乱。坚持2,3,4原则,会让你凌乱的思维重新条理。加油~

你可能感兴趣的:(基础算法)