C#實現連結串列

dennis_zane發表於2007-03-29
    今天受一個帖子的刺激,再次複習起了資料結構與演算法,那本《資料結構與演算法(java版)》我還剩圖和高階排序的幾章沒看,工作上也沒我的事需要處理,就用C#重新寫了一遍連結串列結構,權作複習。

定義List介面:
   public  interface List
    {
        
bool IsEmpty();
        
void Unshift(Object obj);
        Object Shift();
        
void Push(Object obj);
        Object Pop();
        
bool Contain(Object obj);
        
void Delete(Object obj);
        
void PrintAll();
        Object getHead();
        Object getTail();
        void Clear();
    }

實現單向連結串列:
 //單向連結串列
    public class SList:List
    {
        
private SNode head, tail;

        
public SList()
        {
            
this.head = this.tail = null;
        }
        
public bool IsEmpty()
        {
            
return head == null;
        }
        
public void Unshift(Object obj)
        {

            head 
= new SNode(obj, head);
            
if (tail == null)
                tail 
= head;
        }
        
public Object Shift()
        {
            
if (head == null)
                
throw new NullReferenceException();
            Object value 
= head.value;
            
if (head == tail)
                head 
= tail = null;
            
else
                head 
= head.next;
            
return value;
        }

        
public void Push(Object obj)
        {
            
if (!IsEmpty())
            {
                tail.next 
= new SNode(obj);
                tail 
= tail.next;
            }
            
else
                head 
= tail = new SNode(obj);

        }

        
public Object Pop()
        {
            
if (head == null)
                
throw new NullReferenceException();
            Object obj 
= tail.value;
            
if (head == tail)
                head 
= tail = null;
            
else
            {
                
//查詢前驅節點
                for (SNode temp = head; temp.next != null && !temp.next.Equals(tail); temp = temp.next)
                    tail 
= temp;
                tail.next 
= null;
            }
            
return obj;
        }
        
public void PrintAll()
        {
            
string result = "";
            
for (SNode temp = head; temp != null; temp = temp.next)
                result 
+= " " + temp.value.ToString();
            Console.WriteLine(result);
        }

        
public bool Contain(Object obj)
        {
            
if (head == null)
                
return false;
            
else
            {
                
for (SNode temp = head; temp != null; temp = temp.next)
                {
                    
if (temp.value.Equals(obj))
                        
return true;
                }
            }
            
return false;
        }

        
public void Delete(Object obj)
        {
            
if (!IsEmpty())
            {
                
if (head == tail && head.value.Equals(obj))
                    head 
= tail = null;
                
else if (head.value.Equals(obj))
                    head 
= head.next;
                
else
                {
                    
//temp_prev為刪除值的前驅節點
                    for (SNode temp_prev = head, temp = head.next; temp != null; temp_prev = temp_prev.next, temp = temp.next)
                    {
                        
if (temp.value.Equals(obj))
                        {
                            temp_prev.next 
= temp.next;  //設定前驅節點的next為下個節點 
                            if (temp == tail)
                               tail 
= temp_prev;
                            temp 
= null;
                            
break;
                        }
                    }
                }
            }
        }
        
public  Object getHead()
        {
            
return this.head.value;
        }
        
public Object getTail()
        {
            
return this.tail.value;
        }
        public void Clear()
        {

            do
            {
                Delete(head.value);
            } while (!IsEmpty());
        }

    }

    
class SNode
    {
        
public Object value;
        
public SNode next;
        
public SNode(Object value, SNode next)
        {
            
this.value = value;
            
this.next = next;
        }
        
public SNode(Object value)
        {
            
this.value = value;
            
this.next = null;
        }
    }

實現雙向連結串列:
 //雙向連結串列
    public class LinkedList:List
    {
        
private LinkedNode head, tail;

        
public LinkedList()
        {
            head 
= tail = null;
        }
        
public bool IsEmpty()
        {
            
return head == null;
        }

        
public void Unshift(Object obj)
        {
            
if (IsEmpty())
                head 
= tail = new LinkedNode(obj);
            
else
            {
                head 
= new LinkedNode(obj, null, head);
                head.next.prev 
= head;
            }

        }
        
public Object Shift()
        {
            
if (IsEmpty())
                
throw new NullReferenceException();
            Object obj 
= head.value;
            
if (head == tail)
                head 
= tail = null;
            
else
            {
                head 
= head.next;
                head.prev 
= null;
            }
            
return obj;
        }

        
public void Push(Object obj)
        {
            
if (IsEmpty())
                head 
= tail = new LinkedNode(obj);
            
else
            {
                tail 
= new LinkedNode(obj, tail, null);
                tail.prev.next 
= tail;
            }
        }

        
public Object Pop()
        {
            
if (IsEmpty())
                
throw new NullReferenceException();
            Object value 
= tail.value;
            
if (head == tail)
                head 
= tail = null;
            
else
            {
                tail 
= tail.prev;
                tail.next 
= null;
            }
            
return value;
        }
        
public bool Contain(Object obj)
        {
            
if (IsEmpty())
                
return false;
            
else
            {
                
for (LinkedNode temp = head; temp != null; temp = temp.next)
                    
if (temp.value.Equals(obj))
                        
return true;
            }
            
return false;
        }

        
public void Delete(Object obj)
        {
            
if (IsEmpty())
                
throw new NullReferenceException();
            
if (head == tail)
                head 
= tail = null;
            
else
            {
                
for (LinkedNode temp = head; temp != null; temp = temp.next)
                {
                    
if (temp.value.Equals(obj))
                    {
                        
if (temp.value.Equals(obj))
                        {
                            
if (temp == tail)
                            {
                                tail 
= tail.prev;
                                tail.next 
= null;
                                
break;
                            }
                            
else if (temp == head)
                            {
                                head.next.prev 
= null;
                                head 
= head.next;
                            }

                            
else
                                temp.prev.next 
= temp.next;
                        }
                    }
                }

            }
        }

        
public void PrintAll()
        {
            
string result = "";
            
for(LinkedNode temp=head;temp!=null;temp=temp.next)
                result 
+= " " + temp.value.ToString();
            Console.WriteLine(result);
        }
        
public Object getHead()
        {
            
return this.head.value;
        }
        
public Object getTail()
        {
            
return this.tail.value;
        }
        public void Clear()
        {
            do
            {
                Delete(head.value);
            } while (!IsEmpty());

        }
    }
    
class LinkedNode
    {
        
public Object value;
        
public LinkedNode prev;
        
public LinkedNode next;

        
public LinkedNode(Object value, LinkedNode prev, LinkedNode next)
        {
            
this.value = value;
            
this.next = next;
            
this.prev = prev;
        }
        
public LinkedNode(Object value)
        {
            
this.value = value;
        }
    }

相關文章