单链表
来源:互联网 发布: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; }
阅读全文
0 0
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- 单链表
- Linux系统知识小结(七)
- C++代码格式规范引导(二):头文件
- 扩展程序无法拖进谷歌浏览器内的解决办法
- 楔子
- hihocoder #1042 跑马圈地
- 单链表
- IE和火狐的事件机制有什么区别?如何阻止冒泡?
- Python 1-- 模式
- Hibernater测试代码
- vuejs(5)
- XSS测试
- 指针与引用的区别以及引用的三种用法
- android初探rxjava
- PHP 字符串的排序:strcmp()、strcasecmp()和strnatcmp()