带头节点的单链表及其基本操作(Java实现)
来源:互联网 发布:nginx 查看模块 编辑:程序博客网 时间:2024/04/20 06:36
package lwh.linearlist.linklist;public class Node { protected int e; protected Node next; public Node(){}; public Node(int e){ this.e = e; } public Node(int e, Node next){ this.e = e; this.next = next; }}
package lwh.linearlist.linklist;import java.util.Scanner;//带头节点的单链表public class LinkedList { private Node head; public LinkedList(){ Node node = new Node(); node.next = null; head = node; } //头插法建立单链表 public void createListHead(){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int num = sc.nextInt(); if(num != 99){ Node node = new Node(num); node.next = head.next; head.next = node; }else{ break; } } } //尾插法建立单链表 public void createListTail(){ //设立尾指针一直指向表尾节点 Node tail = head; Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int num = sc.nextInt(); if(num != 99){ Node node = new Node(num); tail.next = node; tail = node; }else{ break; } } } //求表长 public int length(){ Node p = head.next; int i = 0; while(p != null){ i++; p = p.next; } return i; } //查找第i个节点值,并返回指向该节点的指针 public Node findIndex(int i){ if(i == 0){ return head; } if(i < 0){ return null; } int j = 1; Node p = head.next; while(p != null && j < i){ p = p.next; j++; } return p; } //按值查找表节点 public Node findValue(int x){ Node p = head.next; while(p != null && p.e != x){ p = p.next; } return p; } //在i处插入节点,0表示头结点,若i超过链表长度则插在最后 public boolean insert(int i, int x){ if(i < 1){ System.out.println("Insert index illeagal"); return false; } Node p = head.next; Node q = p; int j = 1; while(p != null && j < i){ q = p; p = p.next; j++; } Node node = new Node(x); node.next = q.next; q.next = node; return true; } //删除第i个节点 public boolean delete(int i){ if(i < 1){ System.out.println("Delete index illegal"); return false; } if(i > length()){ System.out.println("Delete index illegal"); return false; } Node p = head.next; Node q = head; int j = 1; while(p != null && j < i){ q = p; p = p.next; j++; } q.next = p.next; p.next = null; return true; } //带头节点的单链表中删除所有值为x的节点 public void deleteAllx1(int x){ Node p = head.next; Node q = head; while(p != null){ while(p != null && p.e != x){ q = p; p = p.next; } if(p != null){ q.next = p.next; p.next = null; p = null; p = q.next; }else{ q.next = null; } } } //带头节点的单链表中删除所有值为x的节点 public void deleteAllx2(int x){ Node p = head; Node q = head.next; while(q != null){ if(q.e == x){ p.next = q.next; q = q.next; }else{ p = q; q = q.next; } } } //带头节点的单链表中删除所有值为x的节点,使用尾插法 public void deleteAllx3(int x){ Node r = head, p = head.next, q; while(p != null){ if(p.e != x){//将其插入到单链表后面 r.next = p; r = p; p = p.next; }else{//删除节点 q = p; p = p.next; q = null; } } r.next = null; } //逆序输出带头节点的单链表所有的值,也可以用栈实现 public void reversePrint1(){ if(head.next == null){ System.out.println("No num"); return; } StringBuilder sb = new StringBuilder(); Node node = head.next; while(node != null){ sb.append(node.e); node = node.next; } System.out.println(sb.reverse().toString()); } public void reversePrint2(){ reversePrint2(head.next); System.out.println(); } //逆序输出带头节点的单链表所有的值 private void reversePrint2(Node node){ if(node.next != null){ reversePrint2(node.next); } System.out.print(node.e); } //删除带头节点的单链表中最小值的节点,假设唯一 public boolean deleteMin(){ if(head.next == null){ System.out.println("No num"); return false; } Node q = head, p = head.next, r = head.next; while(p.next != null){ if(p.next.e < r.e){ r = p.next; q = p; } p = p.next; } q.next = r.next; r.next = null; r = null; return true; } //就地逆置单链表,空间复杂度为O(1) public boolean reverse(){ if(length() < 2){ System.out.println("No need to reverse"); return false; } Node p = head.next; Node q = p.next; boolean flag = true; while(q != null){ Node r = q.next; if(flag){ p.next = null; flag = false; } head.next = q; q.next = p; p = q; q = r; } return true; } //使带头节点的单链表递增有序,插入排序 public boolean sort(){ if(length() < 2){ System.out.println("No need to sort"); return false; } Node q = head.next.next; Node r = q.next; head.next.next = null; while(q != null){ Node pre = head; Node p = head.next; while(p != null && q.e > p.e){ pre = p; p = p.next; } pre.next = q; q.next = p; q = r; if(r != null) r = r.next; } return true; } //带表头节点的单链表元素值无序,删除所有在给定区间范围内的所有元素 public boolean deleteInterval(int a, int b){ if(a > b){ System.out.println("Input a <= b"); return false; } Node p = head; Node q = head.next; while(q != null){ if(q.e >= a && q.e <= b){ p.next = q.next; q.next = null; q = p.next; }else{ p = q; q = q.next; } } return true; } //带头节点单链表,递增输出节点值并释放节点空间 public void sortPrint(){ while(head.next != null){ Node pre = head; Node p = pre.next, r = pre.next; while(p.next != null){ if(p.next.e < r.e){ pre = p; r = p.next; } p = p.next; } System.out.print(r.e + ","); pre.next = r.next; r.next = null; r = null; } } //将带头节点的单链表拆分成两个链表,奇数序号在一个,偶数序号在另一个,按原来相对顺序放置 public void breakIntoTwo1(){ LinkedList list1 = new LinkedList(); LinkedList list2 = new LinkedList(); Node p = head.next; Node q = list1.head; Node r = list2.head; int i = 1; while(p != null){ if(i % 2 == 0){ r.next = p; r = p; }else{ q.next = p; q = p; } i++; p = p.next; } q.next = null; r.next = null; list1.print(); list2.print(); } //将带头节点的单链表拆分成两个链表,奇数序号在一个,偶数序号在另一个,偶数序号的逆序放置 public void breakIntoTwo2(){ LinkedList list1 = new LinkedList(); LinkedList list2 = new LinkedList(); Node p = head.next; Node q = list1.head; Node r = list2.head; int i = 1; while(p != null){ Node pre = p.next; if(i % 2 == 0){ p.next = r.next; r.next = p; }else{ q.next = p; q = p; } i++; p = pre; } q.next = null; list1.print(); list2.print(); } //带头节点的单链表中元素递增有序,有重复元素,去重,使重复元素只含一个 public void deleteDuplicate(){ Node p = head.next; Node q = p.next; while(q != null){ if(p.e == q.e){ q = q.next; }else{ p.next = q; p = q; q = q.next; } } p.next = null; } //两个带头节点的单链表递增,合并两个单链表使其递减,利用原来单链表的节点 public void mergeSort(LinkedList list2){ Node p = this.head.next; Node q = list2.head.next; LinkedList newlist = new LinkedList(); Node r = newlist.head; Node after = null; while(p != null && q != null){ if(p.e < q.e){ after = p.next; p.next = r.next; r.next = p; p = after; }else{ after = q.next; q.next = r.next; r.next = q; q = after; } if(q == null){ while(p != null){ after = p.next; p.next = r.next; r.next = p; p = after; } } if(p == null){ while(q != null){ after = q.next; q.next = r.next; r.next = q; q = after; } } } newlist.print(); } //两个带头节点的单链表递增有序,求两个链表的交集并存放于其中一个表,时间复杂度O(len1*len2) public void intersect1(LinkedList list2){ Node pre = this.head, p = pre.next; while(p != null){ Node q = list2.head.next; boolean flag = false; while(q != null){ if(q.e == p.e){ flag = true; break; } q = q.next; } if(flag){ pre = p; p = p.next; }else{ pre.next = p.next; p.next = null; p = pre.next; } } } //两个带头节点的单链表递增有序,求两个链表的交集并存放于其中一个表,时间复杂度O(len1+len2) public void intersect2(LinkedList list2){ Node pre = this.head, p = pre.next; Node q = list2.head.next; while(p != null && q != null){ if(p.e == q.e){ pre.next = p; pre = p; p = p.next; q = q.next; }else if(p.e < q.e){ p = p.next; }else{ q = q.next; } } pre.next = null; } //A,B两个带头节点的 单链表递增有序,求AB公共元素构成有序单链表C public LinkedList intersectC(LinkedList list2){ LinkedList newList = new LinkedList(); Node r = newList.head; Node p = this.head.next; Node q = list2.head.next; while(p != null && q != null){ if(p.e == q.e){ Node node = new Node(p.e); r.next = node; r = node; p = p.next; q = q.next; }else if(p.e < q.e){ p = p.next; }else{ q = q.next; } } return newList; } //两个整数序列构成两个带头节点的单链表A,B,判断B是否是A的连续子序列 public boolean AisContainsB1(LinkedList list2){ if(this.length() < list2.length()){ return false; } Node p = this.head.next; Node q = list2.head.next; boolean flag = true; while(p != null && q != null){ if(p.e != q.e){ if(flag){ p = p.next; } q = list2.head.next; continue; } p = p.next; q = q.next; if(q == null){ return true; } flag = false; } return false; } //两个整数序列构成两个带头节点的单链表A,B,判断B是否是A的连续子序列 public boolean AisContainsB2(LinkedList list2){ if(this.length() < list2.length()){ return false; } Node p = this.head.next, pre = p; Node q = list2.head.next; while(p != null && q != null){ if(p.e == q.e){ p = p.next; q = q.next; }else{ pre = pre.next; p = pre; q = list2.head.next; } } if(q == null){ return true; }else{ return false; } } public void print() { if(head.next == null){ System.out.println("No num"); return; } System.out.print("["); for(Node node = head.next; node != null; node = node.next){ if(node.next != null) System.out.print(node.e + ","); else System.out.print(node.e + "]"); } System.out.println(); }}
阅读全文
0 0
- 带头节点的单链表及其基本操作(Java实现)
- 带头节点的双链表及其基本操作(Java实现)
- 不带头节点的单链表及其基本操作(Java实现)
- 带头节点的单链表的基本操作
- 数据结构(一)单链表的基本操作(不带头节点)
- 带头节点单链表的实现
- 带头节点单链表操作
- 带头节点的单链表的常用操作
- C语言实现单链表(带头结点)的基本操作
- 不带头节点的双向循环链表基本操作
- 带头节点的单链表的实现
- 单链表的实现(不带头节点)
- 带头节点的单链表
- 带头节点的单链表
- 带头节点的单链表
- 带头节点的单链表
- 带头结点的单链表的基本操作
- 带头循环单链表的基本操作
- 破局SaaS服务困境,看看iNAS联合微软和中建材怎么干
- virtual method but non-virtual destructor
- 传智播客“PHP”——初识PHP依我见
- jQuery-第一个ajax列子
- 高并发的核心技术-幂等的实现方案
- 带头节点的单链表及其基本操作(Java实现)
- 多条目加载
- 使用json时报错:nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
- IOS学习笔记——iOS组件之UIScrollView详解(各个方法)
- JVM调优总结(5):典型配置
- 关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
- PTA 7-6(队列) 银行排队问题之单队列多窗口加VIP服务(30 分) 30分代码
- JVM调优总结(6):新一代的垃圾回收算法
- 国庆清北刷题冲刺班 Day5 上午