算法-25反转单向和双向链表

描述

实现反转单向链表和双向链表的函数。
如 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.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
class ListNode {
    int val;
    ListNode next;
    public ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}
 
class ListDNode {
    int val;
    ListDNode prev;
    ListDNode next;
    public ListDNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String[] list1 = br.readLine().trim().split(" ");
        int m = Integer.parseInt(br.readLine().trim());
        String[] list2 = br.readLine().trim().split(" ");
        ListNode head1 = new ListNode(Integer.parseInt(list1[0]));
        ListDNode head2 = new ListDNode(Integer.parseInt(list2[0]));
        ListNode cur1 = head1;
        ListDNode cur2 = head2;
        for(int i = 1; i < list1.length; i++){
            cur1.next = new ListNode(Integer.parseInt(list1[i]));
            cur1 = cur1.next;
        }
        for(int i = 1; i < list2.length; i++){
            cur2.next = new ListDNode(Integer.parseInt(list2[i]));
            ListDNode prev = cur2;
            cur2 = cur2.next;
            cur2.prev = prev;
        }
        ListNode result1 = reverseList(head1);
        ListDNode result2 = reverseDList(head2);
        while(result1 != null){
            System.out.print(result1.val + " ");
            result1 = result1.next;
        }
        System.out.println();
        while(result2 != null){
            System.out.print(result2.val + " ");
            result2 = result2.next;
        }
    }
     
    // 反转单向链表
    private static ListNode reverseList(ListNode cur) {
        ListNode prev = null;
        while(cur != null){
            ListNode temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
     
    // 反转双向链表
    private static ListDNode reverseDList(ListDNode head) {
        ListDNode prev = head;
        ListDNode cur = head.next;
        head.next = null;
        while(cur != null){
            ListDNode temp = cur.next;
            cur.next = prev;
            prev.prev = cur;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}

 

posted @ 2022-07-11 10:32  思凡念真  阅读(126)  评论(2编辑  收藏  举报