Given a linked list, reverse the second half linked list. If the list length is odd, then the middle list node also should be reversed.
For example:
Given: 1 -> 2 -> 3 -> null;
Return: 1 -> 3 -> 2 -> null;
Given: 1 -> 2 -> 3 -> 4 -> null;
Return: 1 -> 2 -> 4 -> 3 -> null;
/*
First compute the size of list to determine the middle list node.
time:O(n), space:O(1)
*/
import java.util.*;
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
next = null;
}
}
public class Solution {
public static ListNode reverseHalfList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
int size = calSize(head);
ListNode middle = getMidNode(head, size);
middle.next = reverse(middle.next);
return head;
}
public static int calSize(ListNode head) {
int size = 0;
while (head != null) {
head = head.next;
size++;
}
return size;
}
public static ListNode getMidNode(ListNode head, int size) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode slow = (size & 1) == 0 ? head : dummy;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static ListNode reverse(ListNode head) {
ListNode newHead = null;
while (head != null) {
ListNode temp = head.next;
head.next = newHead;
newHead = head;
head = temp;
}
return newHead;
}
public static void main(String[] args) {
ListNode n1 = new ListNode (1);
ListNode n2 = new ListNode (2);
ListNode n3 = new ListNode (3);
ListNode n4 = new ListNode (4);
ListNode n5 = new ListNode (5);
ListNode n6 = new ListNode (6);
ListNode n7 = new ListNode (7);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n5.next = n6;
n6.next = n7;
ListNode ans1 = reverseHalfList(n1);
ListNode ans2 = reverseHalfList(n5);
while (ans1 != null) {
System.out.print(ans1.val + " ");
ans1 = ans1.next;
}
System.out.println(" ");
while (ans2 != null) {
System.out.print(ans2.val + " ");
ans2 = ans2.next;
}
}
}
No comments:
Post a Comment