算法-25反转单向和双向链表
描述
实现反转单向链表和双向链表的函数。
如 1->2->3 反转后变成 3->2->1。
输入描述:
第一行一个整数 n,表示单链表的长度。
第二行 n 个整数 val 表示单链表的各个节点。
第三行一个整数 m,表示双链表的长度。
第四行 m 个整数 val 表示双链表的各个节点。
第二行 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; } }