the linked is not geeting completely display . may you please explain why
The output is geeting wrong in even after odd linked lidt problem
import java.util.*;
public class LinkedList {
private class Node {
int data;
Node next;
Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
private Node head;
private Node tail;
private int size;
public LinkedList() {
this.head = null;
this.tail = null;
this.size = 0;
}
public LinkedList(Node head, Node tail, int size) {
this.head = head;
this.tail = tail;
this.size = size;
}
// O(1)
public int size() {
return this.size;
}
// O(1)
public boolean isEmpty() {
return this.size() == 0;
}
// O(1)
public int getFirst() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty.");
}
return this.head.data;
}
// O(1)
public int getLast() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty.");
}
return this.tail.data;
}
// O(N)
public int getAt(int idx) throws Exception {
Node temp = this.getNodeAt(idx);
return temp.data;
}
// O(N)
private Node getNodeAt(int idx) throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
if (idx < 0 || idx >= this.size()) {
throw new Exception("Invalid arguments");
}
Node retVal = this.head;
for (int i = 0; i < idx; i++) {
retVal = retVal.next;
}
return retVal;
}
// O(1)
public void addFirst(int data) {
Node node = new Node(data, this.head);
if (this.size() == 0) {
this.head = node;
this.tail = node;
} else {
this.head = node;
}
this.size++;
}
// O(1)
public void addLast(int data) {
Node node = new Node(data, null);
if (this.size() == 0) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
// O(n)
public void addAt(int idx, int data) throws Exception {
if (idx < 0 || idx > this.size()) {
throw new Exception("Invalid arguments");
}
if (idx == 0) {
this.addFirst(data);
} else if (idx == this.size()) {
this.addLast(data);
} else {
Node nm1 = this.getNodeAt(idx - 1);
Node n = nm1.next;
Node node = new Node(data, n);
nm1.next = node;
this.size++;
}
}
// O(1)
public int removeFirst() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
int retVal = this.head.data;
if (this.size() == 1) {
this.head = null;
this.tail = null;
} else {
this.head = this.head.next;
}
this.size--;
return retVal;
}
// O(n)
public int removeLast() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
int retVal = this.tail.data;
if (this.size() == 1) {
this.head = null;
this.tail = null;
} else {
Node sm2 = this.getNodeAt(this.size() - 2);
sm2.next = null;
this.tail = sm2;
}
this.size--;
return retVal;
}
// O(n)
public int removeAt(int idx) throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
if (idx < 0 || idx >= this.size()) {
throw new Exception("Invalid arguments");
}
if (idx == 0) {
return this.removeFirst();
} else if (idx == this.size() - 1) {
return this.removeLast();
} else {
Node nm1 = this.getNodeAt(idx - 1);
Node n = nm1.next;
Node np1 = n.next;
nm1.next = np1;
this.size--;
return n.data;
}
}
// O(n)
public void display() {
Node node = this.head;
while (node != null) {
System.out.print(node.data + " ");
node = node.next;
}
//System.out.println("END");
}
public void evenAfterOdd() throws Exception {
Node evenstart=null;
Node evenend=null;
Node oddstart=null;
Node oddend=null;
Node curr=this.head;
while(curr!=null){//loop condition should run till end
int element=curr.data;
if(element%2==0){
if(evenstart==null){
evenstart=curr;
evenend=evenstart;
}else{
evenend.next=curr;//the pointer manipulation has to be like this
evenend=curr;
}
}else{
if(oddstart==null){
oddstart=curr;
oddend=oddstart;
}else{
oddend.next=curr;//the pointer manipulation has to be like this
oddend=curr;
}
}
curr=curr.next;
}
if(oddstart==null&&evenstart==null){
return;
}
//handle the case when list contain only odd numbers
//handle the case when list contain only even numbers
oddend.next=evenstart;
evenend.next=null;
this.head=oddstart;
}
public static void main(String[] args) throws Exception {
Scanner scn = new Scanner(System.in);
int N = scn.nextInt();
LinkedList list = new LinkedList();
for (int i = 0; i < N; i++) {
list.addLast(scn.nextInt());
}
list.evenAfterOdd();
list.display();
}
}
the code given by you is just line same to mine… but it giving me a run error in 2nd test case. all other are passed
yaa thats because i have modified your code only…have you handled the special cases which i have mentioned in the code?
if the problem persists share your code here
this is my code … i think i handle the all odd element and all even element case. is there anything else. please mention it.
what if the list is like 2 4 6 8
then oddend will be null and it will give null pointer exception
you are checking the condition when both the lists are empty…you have to check if either one is empty or not
i added 2 if condition to handle empty odd and even llist . but it again doesn’t showing the whole list in output .
please explain why it’s having this type of result//
hope this code works
import java.util.*;
public class LinkedList {
private class Node {
int data;
Node next;
Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
private Node head;
private Node tail;
private int size;
public LinkedList() {
this.head = null;
this.tail = null;
this.size = 0;
}
public LinkedList(Node head, Node tail, int size) {
this.head = head;
this.tail = tail;
this.size = size;
}
// O(1)
public int size() {
return this.size;
}
// O(1)
public boolean isEmpty() {
return this.size() == 0;
}
// O(1)
public int getFirst() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty.");
}
return this.head.data;
}
// O(1)
public int getLast() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty.");
}
return this.tail.data;
}
// O(N)
public int getAt(int idx) throws Exception {
Node temp = this.getNodeAt(idx);
return temp.data;
}
// O(N)
private Node getNodeAt(int idx) throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
if (idx < 0 || idx >= this.size()) {
throw new Exception("Invalid arguments");
}
Node retVal = this.head;
for (int i = 0; i < idx; i++) {
retVal = retVal.next;
}
return retVal;
}
// O(1)
public void addFirst(int data) {
Node node = new Node(data, this.head);
if (this.size() == 0) {
this.head = node;
this.tail = node;
} else {
this.head = node;
}
this.size++;
}
// O(1)
public void addLast(int data) {
Node node = new Node(data, null);
if (this.size() == 0) {
this.head = node;
this.tail = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
// O(n)
public void addAt(int idx, int data) throws Exception {
if (idx < 0 || idx > this.size()) {
throw new Exception("Invalid arguments");
}
if (idx == 0) {
this.addFirst(data);
} else if (idx == this.size()) {
this.addLast(data);
} else {
Node nm1 = this.getNodeAt(idx - 1);
Node n = nm1.next;
Node node = new Node(data, n);
nm1.next = node;
this.size++;
}
}
// O(1)
public int removeFirst() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
int retVal = this.head.data;
if (this.size() == 1) {
this.head = null;
this.tail = null;
} else {
this.head = this.head.next;
}
this.size--;
return retVal;
}
// O(n)
public int removeLast() throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
int retVal = this.tail.data;
if (this.size() == 1) {
this.head = null;
this.tail = null;
} else {
Node sm2 = this.getNodeAt(this.size() - 2);
sm2.next = null;
this.tail = sm2;
}
this.size--;
return retVal;
}
// O(n)
public int removeAt(int idx) throws Exception {
if (this.isEmpty()) {
throw new Exception("List is empty");
}
if (idx < 0 || idx >= this.size()) {
throw new Exception("Invalid arguments");
}
if (idx == 0) {
return this.removeFirst();
} else if (idx == this.size() - 1) {
return this.removeLast();
} else {
Node nm1 = this.getNodeAt(idx - 1);
Node n = nm1.next;
Node np1 = n.next;
nm1.next = np1;
this.size--;
return n.data;
}
}
// O(n)
public void display() {
Node node = this.head;
while (node != null) {
System.out.print(node.data + " ");
node = node.next;
}
//System.out.println("END");
}
public void evenAfterOdd() throws Exception {
Node evenstart=null;
Node evenend=null;
Node oddstart=null;
Node oddend=null;
Node curr=this.head;
while(curr!=null){
int element=curr.data;
if(element%2==0){
if(evenstart==null){
evenstart=curr;
evenend=evenstart;
}else{
evenend.next=curr;//these condition has to be like this i have pinpointed this in prev code alsp
evenend=curr;
}
}else{
if(oddstart==null){
oddstart=curr;
oddend=oddstart;
}else{
oddend.next=curr;//these condition has to be like this i have pinpointed this in prev code alsp
oddend=curr;
}
}
curr=curr.next;
}
if(oddstart==null&&evenstart==null){
return;
}
if(oddstart==null){ // to handle the empty odd list
evenend.next=null;
this.head=evenstart;
return;
}
if(evenstart==null){ // to handle the empty even list
oddend.next=null;
this.head=oddstart;
return;
}
oddend.next=evenstart;
evenend.next=null;
this.head=oddstart; // it again doesn't showing the whole list
}
public static void main(String[] args) throws Exception {
Scanner scn = new Scanner(System.in);
int N = scn.nextInt();
LinkedList list = new LinkedList();
for (int i = 0; i < N; i++) {
list.addLast(scn.nextInt());
}
list.evenAfterOdd();
list.display();
}
}
i dont getting the difference between these 2 codes??
it worked . but how.?? i don’t getting the difference
Check the comments i have provided in the function
yeah i understand that . but what i was doing wrong in my code .
See the pointer manipulation was not correct…do a dry run to figure out
okk. thnx for helping >>