Skip to content

Commit e3c05f3

Browse files
committed
reverse dll and insert element in between
1 parent 2e487de commit e3c05f3

File tree

2 files changed

+155
-0
lines changed

2 files changed

+155
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package codechallenge.linkedlist;
2+
3+
import me.premaseem.reusable.MyDLLNode;
4+
import org.junit.Test;
5+
6+
/*
7+
8+
Challenge: Inserting a Node Into a Sorted Doubly Linked List
9+
1. Empty list
10+
2. At the beginning of the list
11+
3. Somewhere at the middle of the list
12+
4. At the end of the list
13+
*/
14+
15+
16+
public class InsertNodeInSortedLL {
17+
18+
// Test Driven Development by Aseem Jain
19+
@Test
20+
public void test() {
21+
MyDLLNode n1 = new MyDLLNode(-100);
22+
MyDLLNode n2 = new MyDLLNode(0);
23+
MyDLLNode n3 = new MyDLLNode(70);
24+
MyDLLNode n4 = new MyDLLNode(10000);
25+
26+
n1.next = n2;
27+
n2.next = n3;
28+
n3.next = n4;
29+
30+
n4.prev = n3;
31+
n3.prev = n2;
32+
n2.prev = n1;
33+
34+
sortedInsert(n1, 250);
35+
assert n3.next.data == 250;
36+
assert n4.prev.data == 250;
37+
38+
sortedInsert(n1, 250000);
39+
assert n4.next.data == 250000;
40+
41+
}
42+
43+
44+
// Using Recursion
45+
MyDLLNode sortedInsertR(MyDLLNode head, int data) {
46+
if (head == null) {
47+
return new MyDLLNode(data);
48+
} else if (data <= head.data) {
49+
MyDLLNode n = new MyDLLNode(data);
50+
n.next = head;
51+
head.prev = n;
52+
return n;
53+
} else {
54+
MyDLLNode rest = sortedInsert(head.next, data);
55+
head.next = rest;
56+
rest.prev = head;
57+
return head;
58+
}
59+
}
60+
61+
// Using Greedy algorithm
62+
MyDLLNode sortedInsert(MyDLLNode head, int data) {
63+
MyDLLNode nn = new MyDLLNode(data);
64+
if (head == null) {
65+
return nn;
66+
}
67+
MyDLLNode cn = head;
68+
69+
while(cn.next != null && cn.data < data){
70+
cn = cn.next;
71+
}
72+
73+
if(head == cn){
74+
nn.next = cn;
75+
cn.prev = nn;
76+
return nn;
77+
}
78+
79+
if(cn.data<data){
80+
cn.next = nn;
81+
nn.prev = cn;
82+
}else{
83+
nn.next = cn;
84+
nn.prev = cn.prev;
85+
cn.prev.next = nn;
86+
cn.prev = nn;
87+
}
88+
89+
return head;
90+
91+
}
92+
}
93+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package codechallenge.linkedlist;
2+
3+
import me.premaseem.reusable.MyDLLNode;
4+
import org.junit.Test;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
/*
10+
11+
Challenge: Reverse a doubly linked list
12+
13+
*/
14+
15+
16+
public class ReverseDoublyLinkedlist {
17+
18+
// Test Driven Development by Aseem Jain
19+
@Test
20+
public void test() {
21+
MyDLLNode n1 = new MyDLLNode(-100);
22+
MyDLLNode n2 = new MyDLLNode(0);
23+
MyDLLNode n3 = new MyDLLNode(100);
24+
MyDLLNode n4 = new MyDLLNode(250);
25+
26+
n1.next = n2;
27+
n2.next = n3;
28+
n3.next = n4;
29+
30+
n4.prev = n3;
31+
n3.prev = n2;
32+
n2.prev = n1;
33+
34+
MyDLLNode newHead = reverseLL(n1);
35+
36+
while(newHead.next != null){
37+
System.out.println(newHead.data + "> " + newHead.next.data);
38+
assert newHead.data > newHead.next.data;
39+
newHead = newHead.next;
40+
}
41+
42+
}
43+
44+
private MyDLLNode reverseLL(MyDLLNode n1) {
45+
List<MyDLLNode> al = new ArrayList<>();
46+
while(n1 != null){
47+
al.add(n1);
48+
n1 = n1.next;
49+
}
50+
51+
for (int i = al.size()-1; i > 0; i--) {
52+
al.get(i).next = al.get(i-1);
53+
al.get(i-1).prev = al.get(i);
54+
}
55+
al.get(al.size()-1).prev = null;
56+
al.get(0).next = null;
57+
return al.get(al.size()-1);
58+
}
59+
60+
61+
}
62+

0 commit comments

Comments
 (0)