单链表反转

Posted moris5013

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表反转相关的知识,希望对你有一定的参考价值。

比如有一个链表是这样的,1->2->3->4->5,反转后成为 5->4->3->2->1

 

public class MyLinkedList 

    Node head;
    // 1->2->3->4->5

    // 最新添加的节点为head
    public void add(int obj) 
        Node newNode = new Node(obj);
        if (head == null) 
            head = newNode;
         else 
            newNode.next = head;
            head = newNode;
        
    

    // 遍历时候,要新建一个引用first保存head。直接使用head会在遍历完后head的值被修改为null
    public void display() 
        Node first = head;
        StringBuilder sb = new StringBuilder();
        while (first != null) 
            sb.append(first.value + " -> ");
            first = first.next;
        
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    

    public static class Node 

        Node next;
        int value;

        public Node(int value) 
            super();
            this.value = value;
        
    

    //
    public void reverse() 
        // 如果头节点或者第二个节点是null,直接返回
        if (head == null || head.next == null) 
            return;
        
        // 头节点设置为pre,第二个节点设置为当前节点,头节点的下一个设置为null,因为反转以后,头节点就成为最后一个节点了
        Node pre = head;
        Node cur = head.next;
        pre.next = null;
        while (cur != null) 
            // 将当前节点的下一个临时保存
            Node next = cur.next;
            // 当前节点的下一个指向pre
            cur.next = pre;
            // 进行下一轮的循环,当前节点变为下一个节点的next,当前节点右移
            pre = cur;
            cur = next;
        
        // 重新调整head的指向
        head = pre;
    

    // 这种写法和上面的都是相同的流程,只不过更加简洁
    public void reverse2() 
        Node pre = null;// 当前结点的前结点
        Node next = null;// 当前结点的后结点
        while (head != null) // 从左到右,依次把->变为<-
            next = head.next;
            head.next = pre;// 当前结点指向前面的结点
            pre = head;// pre结点右移
            head = next;// head结点右移
        
        this.head = pre;
    

    public static void main(String[] args) 

        MyLinkedList linkedList = new MyLinkedList();
        linkedList.add(5);
        linkedList.add(4);
        linkedList.add(3);
        linkedList.add(2);
        linkedList.add(1);
        linkedList.display();
        linkedList.reverse2();
        linkedList.display();
    

 

以上是关于单链表反转的主要内容,如果未能解决你的问题,请参考以下文章

单链表反转总结篇

单链表反转的2种方法

剑指offer demo之单链表反转

剑指offer demo之单链表反转

单链表反转,快慢指针解决链表的常见问题

看图理解单链表的反转