单链表

来源:互联网 发布:ios仿淘宝首页代码 编辑:程序博客网 时间:2024/06/04 18:22

(1)单链表:在插入和删除元素的时候比顺序表方便,不需要移动所有元素。

单链表的实现class Node{    //创建结点    int value;    Node next;    public Node(){        this(0);    }    public Node(int value){   //初始化        this.value=value;        this.next=null;    }}class LinkList{           //创建单链表    Node head;    public LinkList(){        head=new Node();    }    public boolean empty(){        return head.next==null;    }    public void insertHead(int val){   //头插        Node n=new Node (val);        n.next=head.next;        head.next=n;                }    public void insertTail(int val){   //尾插        Node ptail=head;        while(ptail.next!=null){            ptail=ptail.next;        }        ptail.next=new Node (val);          }    public void delete(int value){        Node pcur=head.next;        Node ppre=head;        while(pcur!=null){            if(pcur.value==value){                ppre.next=pcur.next;                break;            }            ppre=pcur;            pcur=pcur.next;        }           }    public String toString(){        StringBuilder builder=new StringBuilder();        Node n=head.next;        while(n!=null){            builder.append(n.value+ " ");            n=n.next;        }        return builder.toString();      }

(2)与单链表相关的操作

public boolean haveCircle(){         //判断链表是否有环;        if(empty())            return false;        Node sp=head;        Node fp=head;        while(fp.next.next!=null && fp!=sp ){            sp=sp.next;            fp=fp.next.next;                }        if(sp==fp){            System.out.println("true");            return true;        }        System.out.println("false");        return false;       }    public int findReverseKNode(int k){     //寻找倒数第K个结点        Node p=head;        Node q=head.next;        for(int i=0;i<k-1;i++){    //q先走k-1步;            if(q.next!=null){            q=q.next;            }        }        while(q!=null){     //p和q一起走,找到倒数第k个结点;            q=q.next;            p=p.next;        }        return p.value;     }    public Node firstCircleNode(){         //寻找入口结点;        Node sp=head;        Node fp=head;        while(fp.next.next!=null && fp!=sp ){            sp=sp.next;            fp=fp.next.next;                }        if(sp==fp){            Node mp=sp;   //mp为相交结点;            sp=head;              while(mp!=sp){                mp=mp.next;                sp=sp.next;            }            return sp;          }        return null;    }    public boolean isLinkCross(LinkList list){    //判断两个链表是否相交(遍历第一个链表到结尾指针连接到第二个链表,如果有环则相交)        Node p=this.head;        while(p.next!=null){            p=p.next;        }        p.next=list.head;        if(haveCircle()){            return true;        }        return false;               }    public Node LinkCross(LinkList list){    //判断相交,如果相交,返回相交结点;        Node p=this.head;        while(p.next!=null){            p=p.next;        }        p.next=list.head;          //结点p接到另一个链表的头部        Node sp=p;        Node fp=p;        while(fp.next.next!=null && fp!=sp ){            sp=sp.next;            fp=fp.next.next;                }        if(sp==fp){            Node mp=sp;      //mp为环相交结点;            sp=this.head;            while(mp!=sp){                mp=mp.next;                sp=sp.next;            }            return sp;     //sp环入口结点即为链表相交结点;        }        return null;    }