程序员代码面试指南第二版 15.反转单向链表_反转双向链表

welcome to my blog

程序员代码面试指南第二版 15.反转单向链表_反转双向链表

题目描述

题目描述
实现反转单向链表和双向链表的函数。
如 1->2->3 反转后变成 3->2->1。

输入描述:
第一行一个整数 n,表示单链表的长度。

第二行 n 个整数 val 表示单链表的各个节点。

第三行一个整数 m,表示双链表的长度。

第四行 m 个整数 val 表示双链表的各个节点。

输出描述:
在给定的函数内返回相应链表的头指针。

示例1

输入
3
1 2 3
4
1 2 3 4

输出
3 2 1
4 3 2 1

第一次做, 空间复杂度O(1)的反转链表是基础, 务必掌握

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        String[] s1 = sc.nextLine().split(" ");
        int m = Integer.parseInt(sc.nextLine());
        String[] s2 = sc.nextLine().split(" ");
        ListNode head1 = new ListNode(Integer.parseInt(s1[0]));
        ListNode curr1 = head1;
        for(int i=1; i<n; i++){
            curr1.next = new ListNode(Integer.parseInt(s1[i]));
            //
            curr1 = curr1.next;
        }
        curr1 = reverse1(head1);
        while(curr1!=null){
            System.out.print(curr1.val+" ");
            //
            curr1 = curr1.next;
        }
        System.out.println();

        DoubleListNode head2 = new DoubleListNode(Integer.parseInt(s2[0]));
        DoubleListNode curr2 = head2;
        for(int i=1; i<m; i++){
            curr2.next = new DoubleListNode(Integer.parseInt(s2[i]));
            //
            curr2 = curr2.next;
        }
        curr2 = reverse2(head2);
        while(curr2!=null){
            System.out.print(curr2.val+" ");
            //
            curr2 = curr2.next;
        }
    }
    public static class ListNode{
        int val;
        ListNode next=null;
        ListNode(int val){
            this.val = val;
        }
    }
    public static ListNode reverse1(ListNode head){
        if(head==null)
            return head;
        ListNode left=null, curr=head, right;
        while(curr!=null){
            //save next node
            right = curr.next;
            //execute
            curr.next = left;
            //update
            left = curr;
            curr = right;
        }
        return left;
    }
    public static class DoubleListNode{
        int val;
        DoubleListNode next=null;
        DoubleListNode last=null;
        DoubleListNode(int val){
            this.val = val;
        }
    }
    public static DoubleListNode reverse2(DoubleListNode head){
        if(head==null)
            return head;
        DoubleListNode left=null, curr=head, right;
        while(curr!=null){
            //save next node
            right = curr.next;
            //execute; 只处理当前节点的指针指向, 不用管别的节点的指针指向
            curr.next = left;
            curr.last = right;
            //update
            left = curr;
            curr = right;
        }
        return left;
    }
}

你可能感兴趣的:(程序员代码面试指南第二版)