和上一篇相比,增加两个方法,一个是在链表中查找包含指定关键字的链结点,一个是在链表中删除包含指定关键字的链结点。
按照关键字查找的方法可以如下实现,注释部分为本人尝试时做写出的代码:
public Link find(int key) //find a link according given key
{
/* the following is by myself,not good enough,acturally I needn't temp!
Link current=first;
Link temp=null;
while(current.iData != key)
{
if(current.next == null)
{
current = null;
}
else
{
current = current.next;
}
}
temp = current;
return temp;
*/
Link current = first;
while(current.iData != key)
{
if(current.next == null)
{
return null;
}
else
{
current = current.next;
}
}
return current;
}
按照关键字删除某个链结点,并将其返回:
public Link deletGivenLink(int key) //delete a link according given key
{
/*
*the following code is by myself, note good eneagh!
Link temp = null;
Link current = first;
while(current.iData != key)
{
temp = current;
current = current.next;
}
temp.next = current.next;
return current;
*/
//follwowing by the text book
Link current = first;
Link previous = first;
while(current.iData != key)
{
if(current.next == null)
{
return null;
}
else
{
previous = current;
current = current.next;
}
}
if(current == first)
{
first = first.next;
}
else
{
previous.next = current.next;
}
return current;
}
完整代码:
class Link
{
public int iData;
public double dData;
public Link next;
//-------------------------------------
public Link(int iData,double dData)
{
this.iData = iData;
this.dData = dData;
}
//-------------------------------------
public void displayLink()
{
System.out.print("{" + iData + ", " + dData + "}");
}
}
class LinkList
{
private Link first;
public LinkList()
{
first = null;
}
public boolean isEmpty()
{
return (first == null);
}
public void insertFirst(int id, double dd)
{
Link newLink = new Link(id, dd);
newLink.next = first;
first = newLink;
}
public Link deleteFirst()
{
Link temp = first;
first = first.next;
return temp;
}
public void displayList()
{
System.out.println("List(first-->last): ");
Link current = first;
while(current != null)
{
current.displayLink();
current = current.next;
}
System.out.println("");
}
public Link find(int key) //find a link according given key
{
/* the following is by myself,not good enough,acturally I needn't temp!
Link current=first;
Link temp=null;
while(current.iData != key)
{
if(current.next == null)
{
current = null;
}
else
{
current = current.next;
}
}
temp = current;
return temp;
*/
Link current = first;
while(current.iData != key)
{
if(current.next == null)
{
return null;
}
else
{
current = current.next;
}
}
return current;
}
public Link deletGivenLink(int key) //delete a link according given key
{
/*
*the following code is by myself, note good eneagh!
Link temp = null;
Link current = first;
while(current.iData != key)
{
temp = current;
current = current.next;
}
temp.next = current.next;
return current;
*/
//follwowing by the text book
Link current = first;
Link previous = first;
while(current.iData != key)
{
if(current.next == null)
{
return null;
}
else
{
previous = current;
current = current.next;
}
}
if(current == first)
{
first = first.next;
}
else
{
previous.next = current.next;
}
return current;
}
}
public class LinkListApp2
{
public static void main(String[] args)
{
LinkList theList = new LinkList(); //nake new list
theList.insertFirst(12,23.66); //insert four items,remember alwayls insert from the first link
theList.insertFirst(174,2454.66);
theList.insertFirst(154,25554.66);
theList.insertFirst(189,256.66);
theList.displayList(); //display list
Link f = theList.find(154);
if(f != null)
{
System.out.println("Found link with key " + f.iData);
}
else
{
System.out.println("Can't find link");
}
Link d = theList.deletGivenLink(12);
if(d != null)
{
System.out.println("Deleted link with key " + d.iData);
}
else
{
System.out.println("Can't delete link");
}
theList.displayList(); //display list
}
}
运行效果: