程序员代码面试指南刷题--第二章.反转单向链表

题目描述

实现反转单向链表和双向链表的函数。
如 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

解法一:不难但是一次就能跑出来还是很有成就感的

import java.io.*;
public class Main{
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static ListNode creatList(int len,String[] ss){
        ListNode head = new ListNode(0);
        ListNode r = head;
        for(int i=0;i<len;i++){
            ListNode node = new ListNode(Integer.parseInt(ss[i]));
            r.next = node;
            r = node;
        }
        return head.next;
    }
    public static DListNode creatDList(int len,String[] ss){
        DListNode head = new DListNode(0);
        DListNode r = head;
        for(int i=0;i<len;i++){
            DListNode node = new DListNode(Integer.parseInt(ss[i]));
            r.next = node;
            node.pre = r;
            r = node;
        }
        if(head.next!=null) head.next.pre = null;
        return head.next;
    }
    public static ListNode reverse(ListNode head){
        if(head==null||head.next==null) return head;
        ListNode pre = head;
        ListNode tmp = head.next;
        pre.next = null;
        while(tmp!=null){
            ListNode r = tmp.next;
            tmp.next = pre;
            pre = tmp;
            tmp = r;
        }
        return pre;
    }
    public static DListNode reverse(DListNode head){
        if(head==null||head.next==null) return head;
        DListNode tmp = head;
        DListNode pre = null;
        while(tmp!=null){
            pre = tmp.pre;
            tmp.pre = tmp.next;
            tmp.next = pre;
            tmp = tmp.pre;
        }
        return pre.pre;
    }
    public static void main(String[] args) throws IOException{
        int len1 = Integer.parseInt(br.readLine());
        String[] ss1 = br.readLine().trim().split(" ");
        ListNode head = creatList(len1,ss1);
        int len2 = Integer.parseInt(br.readLine());
        String[] ss2 = br.readLine().trim().split(" ");
        DListNode Dhead = creatDList(len2,ss2);
        head = reverse(head);
        Dhead = reverse(Dhead);
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        while(head!=null){
            sb1.append(head.val).append(" ");
            head = head.next;
        }
        while(Dhead!=null){
            sb2.append(Dhead.val).append(" ");
            Dhead = Dhead.next;
        }
        System.out.println(sb1.toString());
        System.out.println(sb2.toString());
    }
}
class ListNode{
    int val;
    ListNode next;
    public ListNode(int val){
        this.val = val;
        this.next = null;
    }
}
class DListNode{
    int val;
    DListNode pre;
    DListNode next;
    public DListNode(int val){
        this.val = val;
        this.pre = null;
        this.next = null;
    }
}

你可能感兴趣的:(程序员代码面试指南刷题)