Skip to content

Commit d78a093

Browse files
author
freemanzhang
committed
refactor code
reverse linked list in k group
1 parent 6d64ed8 commit d78a093

File tree

2 files changed

+126
-138
lines changed

2 files changed

+126
-138
lines changed

src/facebook/easy/RomanToInteger.java

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 126 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,126 @@
1-
package linkedList;
2-
3-
import org.junit.Ignore;
4-
import org.junit.Test;
5-
6-
import utility.ListFactory;
7-
import utility.ListNode;
8-
import utility.Print;
9-
10-
/**
11-
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
12-
13-
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
14-
15-
You may not alter the values in the nodes, only nodes itself may be changed.
16-
17-
Only constant memory is allowed.
18-
19-
For example,
20-
Given this linked list: 1->2->3->4->5
21-
22-
For k = 2, you should return: 2->1->4->3->5
23-
24-
For k = 3, you should return: 3->2->1->4->5
25-
*/
26-
public class ReverseNodesInKGroup
27-
{
28-
public ListNode reverseKGroup( ListNode head, int k )
29-
{
30-
ListNode dummyHead = new ListNode( 0 );
31-
dummyHead.next = head;
32-
ListNode tailNode = dummyHead;
33-
34-
ListNode currNode = head;
35-
while ( currNode != null )
36-
{
37-
// find the next k th node
38-
int nodeCounter = 1;
39-
ListNode kthNode = currNode;
40-
while ( nodeCounter < k
41-
&& kthNode != null )
42-
{
43-
nodeCounter++;
44-
kthNode = kthNode.next;
45-
}
46-
if ( kthNode == null )
47-
{
48-
break;
49-
}
50-
51-
// reverse the next k nodes
52-
ListNode beforeThisRoundStart = tailNode;
53-
ListNode nextRoundStart = kthNode.next;
54-
ListNode reversedListTail = currNode;
55-
ListNode reversedListHead = reverseKNodes( currNode, k );
56-
57-
// concatenate list
58-
beforeThisRoundStart.next = reversedListHead;
59-
reversedListTail.next = nextRoundStart;
60-
61-
// move to next round
62-
tailNode = reversedListTail;
63-
currNode = nextRoundStart;
64-
}
65-
66-
return dummyHead.next;
67-
}
68-
69-
private ListNode reverseKNodes( ListNode head, int k )
70-
{
71-
ListNode dummyHead = new ListNode( 0 );
72-
ListNode currNode = head;
73-
int count = 0;
74-
while ( currNode != null
75-
&& count < k )
76-
{
77-
// prepare for next round loop
78-
ListNode dummyHeadNextBuffer = dummyHead.next;
79-
ListNode currNodeNextBuffer = currNode.next;
80-
81-
// ... do job in this round loop
82-
dummyHead.next = currNode;
83-
currNode.next = dummyHeadNextBuffer;
84-
85-
// move to next round loop
86-
currNode = currNodeNextBuffer;
87-
count++;
88-
}
89-
return dummyHead.next;
90-
}
91-
92-
@Test
93-
public void test()
94-
{
95-
ListNode head = ListFactory.createSingleNodeList();
96-
ListNode result = reverseKGroup( head, 1 );
97-
Print.printListNode( result );
98-
}
99-
100-
@Test
101-
public void test2()
102-
{
103-
ListNode head = ListFactory.createSingleNodeList();
104-
head = reverseKGroup( head, 2 );
105-
Print.printListNode( head );
106-
}
107-
108-
@Test
109-
public void test3()
110-
{
111-
ListNode head = ListFactory.createOddNodeList();
112-
ListNode result = reverseKGroup( head, 2 );
113-
Print.printListNode( result );
114-
}
115-
116-
@Test
117-
public void test4()
118-
{
119-
ListNode evenList = ListFactory.createEvenNodeList();
120-
ListNode result = reverseKGroup( evenList, 2 );
121-
Print.printListNode( result );
122-
}
123-
}
1+
package linkedList;
2+
3+
import org.junit.Ignore;
4+
import org.junit.Test;
5+
6+
import utility.ListFactory;
7+
import utility.ListNode;
8+
import utility.Print;
9+
10+
/**
11+
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
12+
13+
If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
14+
15+
You may not alter the values in the nodes, only nodes itself may be changed.
16+
17+
Only constant memory is allowed.
18+
19+
For example,
20+
Given this linked list: 1->2->3->4->5
21+
22+
For k = 2, you should return: 2->1->4->3->5
23+
24+
For k = 3, you should return: 3->2->1->4->5
25+
*/
26+
public class ReverseNodesInKGroup
27+
{
28+
public ListNode reverseKGroup( ListNode head, int k )
29+
{
30+
// Start typing your Java solution below
31+
// DO NOT write main() function
32+
if ( head == null || k == 1 )
33+
{
34+
return head;
35+
}
36+
37+
ListNode dummy = new ListNode( 0 );
38+
dummy.next = head;
39+
40+
ListNode beforeKGroup = dummy;
41+
ListNode currNode = head;
42+
43+
for ( int i = 1; currNode != null; i++ )
44+
{
45+
if ( i % k == 0 )
46+
{
47+
ListNode nextBeforeKGroup = beforeKGroup.next;
48+
reverse( beforeKGroup, currNode.next );
49+
beforeKGroup = nextBeforeKGroup;
50+
currNode = beforeKGroup.next;
51+
}
52+
else
53+
{
54+
currNode = currNode.next;
55+
}
56+
}
57+
58+
return dummy.next;
59+
}
60+
61+
/**
62+
* Reverse a link list between pre and next exclusively
63+
* an example:
64+
* a linked list:
65+
* 0->1->2->3->4->5->6
66+
* | |
67+
* pre next
68+
* after call pre = reverse(pre, next)
69+
*
70+
* 0->3->2->1->4->5->6
71+
* | |
72+
* pre next
73+
* @param pre
74+
* @param next
75+
*/
76+
public void reverse( ListNode firstNode, ListNode lastNode )
77+
{
78+
ListNode dummyHead = new ListNode( 0 );
79+
ListNode reverseTail = firstNode.next;
80+
81+
ListNode currNode = firstNode.next;
82+
while ( currNode != lastNode )
83+
{
84+
ListNode dummyHeadNext = dummyHead.next;
85+
ListNode nextNode = currNode.next;
86+
dummyHead.next = currNode;
87+
currNode.next = dummyHeadNext;
88+
currNode = nextNode;
89+
}
90+
91+
firstNode.next = dummyHead.next;
92+
reverseTail.next = lastNode;
93+
}
94+
95+
@Test
96+
public void test()
97+
{
98+
ListNode head = ListFactory.createSingleNodeList();
99+
ListNode result = reverseKGroup( head, 1 );
100+
Print.printListNode( result );
101+
}
102+
103+
@Test
104+
public void test2()
105+
{
106+
ListNode head = ListFactory.createSingleNodeList();
107+
head = reverseKGroup( head, 2 );
108+
Print.printListNode( head );
109+
}
110+
111+
@Test
112+
public void test3()
113+
{
114+
ListNode head = ListFactory.createOddNodeList();
115+
ListNode result = reverseKGroup( head, 2 );
116+
Print.printListNode( result );
117+
}
118+
119+
@Test
120+
public void test4()
121+
{
122+
ListNode evenList = ListFactory.createEvenNodeList();
123+
ListNode result = reverseKGroup( evenList, 2 );
124+
Print.printListNode( result );
125+
}
126+
}

0 commit comments

Comments
 (0)