《剑指offer》链表第三题:反转链表

此题有两种思路,一种是用三指针法,另一张是递归思想。

以下是三指针法的解法:

package 链表;

class ListNode1
{

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

    public Node rollback(Node node1)
    {
        if(node1==null)
            return null;
        Node prev=null;
        Node cur=node1;
        while(cur!=null)
        {
            Node temp=cur.next;
            cur.next=prev;
            prev=cur;
            cur=temp;
        }
        return prev;
    }

    public static void main(String[] args) {
        ListNode1 list=new ListNode1();

        Node node1=list.new Node(11);
        Node node2=list.new Node(22);
        Node node3=list.new Node(33);
        Node node4=list.new Node(44);
        Node node5=list.new Node(55);

        node1.next=node2;
        node2.next=node3;
        node3.next=node4;
        node4.next=node5;

        Node result=list.rollback(node1);
        Node cur=result;                 //在代码中定义这个cur变量用于遍历链表并打印节点的值
                                         //为什么新定义这个变量呢?因为在执行回滚操作后,原链表的头节点变成了尾节点
                                          //直接使用result.val打印节点的值,只能打印新链表的尾节点的值,无法遍历整个链表。
                                    
        while(cur!=null)
        {
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
    }
}

以下是递归解法:

package 链表;

class ListNode1
{

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

    public Node rollback(Node prev,Node cur)
    {
        if(cur==null)
            return prev;
        Node temp=cur.next;
        cur.next=prev;
        return rollback(cur,temp);
    }

    public static void main(String[] args) {
        ListNode1 list=new ListNode1();

        Node node1=list.new Node(11);
        Node node2=list.new Node(22);
        Node node3=list.new Node(33);
        Node node4=list.new Node(44);
        Node node5=list.new Node(55);

        node1.next=node2;
        node2.next=node3;
        node3.next=node4;
        node4.next=node5;

        Node result=list.rollback(null,node1);
        Node cur=result;

        while(cur!=null)
        {
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
    }
}

以下是运行结果,两种方法一致:

你可能感兴趣的:(链表,数据结构)