Lecture 10
Lecture 10
Ghulam Farooque
Assistant Professor
Department: CS & IT
The University of Lahore
Email: [email protected]
Circularly-linked lists
The next field in the last node in a singly-linked
list is set to NULL.
Moving along a singly-linked list has to be done
in a watchful manner.
Doubly-linked lists have two NULL pointers:
prev in the first node and next in the last node.
A way around this potential hazard is to link the
last node with the first node in the list to create
a circularly-linked list.
Circularly-linked lists
The next field in the last node in a singly-linked
list is set to NULL.
Moving along a singly-linked list has to be done
in a watchful manner.
Doubly-linked lists have two NULL pointers: prev
in the first node and next in the last node.
A way around this potential hazard is to link the
last node with the first node in the list to create a
circularly-linked list.
Circularly-linked lists
The next field in the last node in a singly-linked
list is set to NULL.
Moving along a singly-linked list has to be done
in a watchful manner.
Doubly-linked lists have two NULL pointers:
prev in the first node and next in the last node.
A way around this potential hazard is to link the
last node with the first node in the list to create
a circularly-linked list.
Circularly-linked lists
The next field in the last node in a singly-linked
list is set to NULL.
Moving along a singly-linked list has to be done
in a watchful manner.
Doubly-linked lists have two NULL pointers:
prev in the first node and next in the last node.
A way around this potential hazard is to link the
last node with the first node in the list to create
a circularly-linked list.
Cicularly Linked List
Two views of a circularly linked list:
current
head 2 6 8 7 1 size=5
current
6
8
size=5
head 2
1
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Consider there are 10 persons. They would like
to choose a leader.
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Consider there are 10 persons. They would like
to choose a leader.
The way they decide is that all 10 sit in a circle.
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Consider there are 10 persons. They would like
to choose a leader.
The way they decide is that all 10 sit in a circle.
They start a count with person 1 and go in
clockwise direction and skip 3. Person 4
reached is eliminated.
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Consider there are 10 persons. They would like
to choose a leader.
The way they decide is that all 10 sit in a circle.
They start a count with person 1 and go in
clockwise direction and skip 3. Person 4
reached is eliminated.
The count starts with the fifth and the next
person to go is the fourth in count.
Josephus Problem
A case where circularly linked list comes in
handy is the solution of the Josephus Problem.
Consider there are 10 persons. They would like
to choose a leader.
The way they decide is that all 10 sit in a circle.
They start a count with person 1 and go in
clockwise direction and skip 3. Person 4
reached is eliminated.
The count starts with the fifth and the next
person to go is the fourth in count.
Eventually, a single person remains.
Josephus Problem
N=10, M=3
4
3 5
2 6
1
7
10
8
9
Josephus Problem
N=10, M=3
eliminated
4
3 5
2 6
1
7
10
8
9
Josephus Problem
N=10, M=3
eliminated
4
3 5
8
2 6
1
7
10
9
Josephus Problem
N=10, M=3
eliminated
4
3 5
8
6
2
1
7
10
9
Josephus Problem
N=10, M=3
eliminated
4
3 5
8
6
2
1 7
10
9
Josephus Problem
N=10, M=3
eliminated
4
5
8
6
2
1 7
3
10
9
Josephus Problem
N=10, M=3
eliminated
4
5
8
6
2
1 7
10
9
Josephus Problem
N=10, M=3
eliminated
4
5
8
6
2
1 7
10
9
Josephus Problem
N=10, M=3
eliminated
4
5
8
6
2
10
1
Josephus Problem
N=10, M=3
eliminated
4
5
8
10
6
Josephus Problem
#include "CList.cpp"
void main()
{
CList list;
int i, N=10, M=3;
for(i=1; i <= N; i++ ) list.add(i);
list.start();
while( list.length() > 1 ) {
for(i=1; i <= M; i++ ) list.next();
cout << "remove: " << list.get() << endl;
list.remove();
}
cout << "leader is: " << list.get() << endl;
}
Josephus Problem
Using a circularly-linked list made the solution
trivial.
Josephus Problem
Using a circularly-linked list made the solution
trivial.
The solution would have been more difficult if
an array had been used.
Josephus Problem
Using a circularly-linked list made the solution
trivial.
The solution would have been more difficult if
an array had been used.
This illustrates the fact that the choice of the
appropriate data structures can significantly
simplify an algorithm. It can make the algorithm
much faster and efficient.
Josephus Problem
Using a circularly-linked list made the solution
trivial.
The solution would have been more difficult if
an array had been used.
This illustrates the fact that the choice of the
appropriate data structures can significantly
simplify an algorithm. It can make the algorithm
much faster and efficient.
Later we will see how some elegant data
structures lie at the heart of major algorithms.
Josephus Problem
Using a circularly-linked list made the solution
trivial.
The solution would have been more difficult if
an array had been used.
This illustrates the fact that the choice of the
appropriate data structures can significantly
simplify an algorithm. It can make the algorithm
much faster and efficient.
Later we will see how some elegant data
structures lie at the heart of major algorithms.
An entire CS course “Design and Analysis of
Algorithms” is devoted to this topic.
Abstract Data Type
We have looked at four different
implementations of the List data structures:
Using arrays
Singly linked list
Doubly linked list
Circularly linked list.
Abstract Data Type
We have looked at four different
implementations of the List data structures:
Using arrays
Singly linked list
Doubly linked list
Circularly linked list.
The interface to the List stayed the same, i.e.,
add(), get(), next(), start(), remove() etc.
Abstract Data Type
We have looked at four different
implementations of the List data structures:
Using arrays
Singly linked list
Doubly linked list
Circularly linked list.
The interface to the List stayed the same, i.e.,
add(), get(), next(), start(), remove() etc.
The list is thus an abstract data type; we use it
without being concerned with how it is
implemented.
Abstract Data Type
What we care about is the methods that are
available for use with the List ADT.
Abstract Data Type
What we care about is the methods that are
available for use with the List ADT.
We will follow this theme when we develop
other ADT.
Abstract Data Type
What we care about is the methods that are
available for use with the List ADT.
We will follow this theme when we develop
other ADT.
We will publish the interface and keep the
freedom to change the implementation of ADT
without effecting users of the ADT.
Abstract Data Type
What we care about is the methods that are
available for use with the List ADT.
We will follow this theme when we develop
other ADT.
We will publish the interface and keep the
freedom to change the implementation of ADT
without effecting users of the ADT.
The C++ classes provide us the ability to create
such ADTs.
Circularly Linked List Advantages