Our next example program adds methods to search a linked list for a data item with a specified key value, and to delete an item with a specified key value. These, along with insertion at the start of the list, are the same operations carried out by the LinkList Workshop applet. The complete linkList2.java program is shown in Listing 5.2.
Previous Table of Contents Next
MWSS: Data Structures and Algorithms in Java
by Robert Lafore
Waite Group Press, Macmillan Computer Publishing ISBN: 1571690956 Pub Date: 03/20/98
Previous Table of Contents Next
Listing 5.2 The linkList2.java Program
// linkList2.java
// demonstrates linked list
// to run this program: C>java LinkList2App
//////////////////////////////////////////////////////////////// class Link
{
public int iData; // data item (key) public double dData; // data item
public Link next; // next link in list
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public Link(int id, double dd) // constructor
{
iData = id; dData = dd; }
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void displayLink() // display ourself
{
System.out.print(“{“ + iData + “, “ + dData + “} “); }
} // end class Link
//////////////////////////////////////////////////////////////// class LinkList
{
private Link first; // ref to first link on list
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public LinkList() // constructor
{
first = null; // no links on list yet }
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void insertFirst(int id, double dd)
{ // make new link Link newLink = new Link(id, dd);
newLink.next = first; // it points to old first link first = newLink; // now first points to this }
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public Link find(int key) // find link with given key { // (assumes non−empty list) Link current = first; // start at 'first’ while(current.iData != key) // while no match, {
if(current.next == null) // if end of list, return null; // didn’t find it else // not end of list, current = current.next; // go to next link }
return current; // found it }
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public Link delete(int key) // delete link with given key { // (assumes non−empty list)
Link current = first; // search for link Link previous = first;
while(current.iData != key) {
if(current.next == null)
return null; // didn’t find it else
{
previous = current; // go to next link current = current.next;
}
} // found it if(current == first) // if first link, first = first.next; // change first else // otherwise, previous.next = current.next; // bypass it return current;
}
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− public void displayList() // display the list
{
System.out.print(“List (first−−>last): “);
Link current = first; // start at beginning of list while(current != null) // until end of list,
{
current.displayLink(); // print data
current = current.next; // move to next link }
System.out.println(“”); }
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− } // end class LinkList
//////////////////////////////////////////////////////////////// class LinkList2App
{
public static void main(String[] args) {
LinkList theList = new LinkList(); // make list
theList.insertFirst(22, 2.99); // insert 4 items theList.insertFirst(44, 4.99);
theList.insertFirst(66, 6.99); theList.insertFirst(88, 8.99);
theList.displayList(); // display list
Link f = theList.find(44); // find item if( f != null)
System.out.println(“Found link with key “ + f.iData); else
System.out.println(“Can’t find link”);
Link d = theList.delete(66); // delete item if( d != null )
System.out.println(#147;Deleted link with key “ + d.iData); else
System.out.println(“Can’t delete link”);
theList.displayList(); // display list } // end main()
} // end class LinkList2App
The main() routine makes a list, inserts four items, and displays the resulting list. It then searches for the item with key 44, deletes the item with key 66, and displays the list again. Here’s the output:
List (first−−>last): {88, 8.99} {66, 6.99} {44, 4.99} {22, 2.99}
Found link with key 44 Deleted link with key 66
List (first−−>last): {88, 8.99} {44, 4.99} {22, 2.99}
THE find() METHOD
The find() method works much like the displayList() method seen in the last program. The reference
current initially points to first, and then steps its way along the links by setting itself repeatedly to
current.next. At each link, find() checks if that link’s key is the one it’s looking for. If it is, it returns with a reference to that link. If it reaches the end of the list without finding the desired link, it returns null.
THE delete() METHOD
The delete() method is similar to find() in the way it searches for the link to be deleted. However, it needs to maintain a reference not only to the current link (current), but to the link preceding the current link (previous). This is because, if it deletes the current link, it must connect the preceding link to the following link, as shown in Figure 5.8. The only way to tell where the preceding link is, is to maintain a reference to it.
FIGURE 5.8 Deleting a specified link
Previous Table of Contents Next
MWSS: Data Structures and Algorithms in Java
by Robert Lafore
Waite Group Press, Macmillan Computer Publishing ISBN: 1571690956 Pub Date: 03/20/98
Previous Table of Contents Next
At each cycle through the while loop, just before current is set to current.next, previous is set to
current. This keeps it pointing at the link preceding current.
To delete the current link once it’s found, the next field of the previous link is set to the next link. A special case arises if the current link is the first link because the first link is pointed to by the LinkList’s first
field and not by another link. In this case the link is deleted by changing first to point to first.next, as we saw in the last program with the deleteFirst() method. Here’s the code that covers these two
possibilities:
// found it if(current == first) // if first link, first = first.next; // change first else // otherwise, previous.next = current.next; // bypass link
OTHER METHODS
We’ve seen methods to insert and delete items at the start of a list and to find a specified item and delete a specified item. You can imagine other useful list methods. For example, an insertAfter() method could find a link with a specified key value and insert a new link following it. We’ll see such a method when we talk about list iterators at the end of this chapter.