1.建立一个顺序存储的线性表,查找顺序表中第一个出现的值为z的元素并输出其位置。
1 package com.neusoft.exercise; 2 import com.neusoft.List.SequenceList; 3 /** 4 * @author zhao-chj 5 * 建立一个顺序存储的线性表,查找顺序表中第一个出现的值为z 6 *的元素并输出其位置。 7 *1.建立一个顺序存储的线性表 8 *2.首先初始化线性表,并且插入值为z的元素 9 *3.查找第一个出现值为z的元素 10 *4.对于位置的判断需要考虑是否符合要求 11 *5.并输出该元素的位置 12 */ 13 public class TestLinearTable01 { 14 public static void main(String[] args) { 15 //1.建立一个顺序存储的线性表 16 SequenceList L = new SequenceList(10); 17 //2.首先初始化线性表,并且插入值为z的元素 18 L.insert(0, 'a'); 19 L.insert(1, 'z'); 20 L.insert(2, 'd'); 21 L.insert(3, 'm'); 22 L.insert(4, 'z'); 23 //3.查找第一个出现值为z的元素 24 int location = L.indexOf('z'); 25 //4.对于位置的判断需要考虑是否符合要求 26 if (location!=-1) { 27 System.out.println("第一次出现z元素的位置为:"+location); 28 }else { 29 System.out.println("顺序表中不存在为z的元素"); 30 } 31 //5.并输出该元素的位置 32 } 33 }
输出结果为:
2.编程实现查找顺序线性表(0,1,2,3,...n-1)中第i个数据元素的直接前驱和后继,并输出他的值。在顺序表中实现。
1 package com.neusoft.exercise; 2 import java.util.Scanner; 3 import com.neusoft.List.SequenceList; 4 5 /** 6 * @author zhao-chj 7 * 题2:编程实现查找线性表(0,1,2,3,...n-1)中第i个数据元素 8 * 的直接前驱和后继,并输出他的值。在顺序表中实现。 9 * 1.初始化线性表并构造一个有50个空间的顺序表 10 * 2.在线性表中插入元素,按照(i,i),i=0,1,2... 11 * 3.用户输入i的值,表示查找第几个元素的前驱和后继 12 * 4.查找线性表中第i个元素的前驱,并输出 13 * 5.查找线性表中的第i个元素的后继,并输出 14 */ 15 public class TestLinearTable02 { 16 public static void main(String[] args) { 17 // 1.初始化线性表并构造一个有50个空间的顺序表 18 SequenceList L = new SequenceList(50); 19 // 2.在线性表中插入元素,按照(i,i),i=0,1,2... 20 int n=10; 21 for (int i = 0; i < n; i++) { 22 L.insert(i, i); 23 } 24 // 3.用户输入i的值,表示查找第几个元素的前驱和后继 25 System.out.println("请您输入要查询的元素"); 26 int in = new Scanner(System.in).nextInt(); 27 // 4.查找线性表中第i个元素的前驱,并输出 28 if (in>0&&in<n) { 29 Object x = L.get(in-1); 30 System.out.println("第"+in+"个元素的前驱为:"+x); 31 }else { 32 System.out.println("第"+in+"个元素的前驱不存在"); 33 } 34 // 5.查找线性表中的第i个元素的后继,并输出 35 if (in>=0&&in<n-1) { 36 Object x = L.get(in+1); 37 System.out.println("第"+in+"个元素的后继为:"+x); 38 }else { 39 System.out.println("第"+in+"个元素的后继不存在"); 40 } 41 42 } 43 }
输出结果为:
3.实现以单链表形式的线性表中查找第i个元素的直接前驱和后继
1 package com.neusoft.exercise; 2 3 import java.util.Scanner; 4 5 import com.neusoft.link.LinkedList; 6 7 /** 8 * @author zhao-chj 9 * 实现以单链表形式的线性表中查找第i个元素的直接前驱和后继 10 * 1.初始化单链表,并用for循环赋值 11 * 2.用户输入要查询单链表中第i个值 12 * 3.调用单链表的方法或函数去实现查找第i个元素的直接前驱和后继 13 */ 14 public class TestLinearTable03 { 15 public static void main(String[] args) { 16 int n=10; 17 //1.初始化单链表,并用for循环赋值 18 LinkedList L = new LinkedList(); 19 for (int i = 0; i < n; i++) { 20 L.insert(i, i); 21 } 22 L.display(); 23 //2.用户输入要查询单链表中第i个值 24 System.out.println("请输入第i个值~"); 25 int input = new Scanner(System.in).nextInt(); 26 //3.调用单链表的方法或函数去实现查找第i个元素的直接前驱和后继 27 if (input>0&&input<n) { 28 System.out.println("第"+input+"个元素的前驱是:"+L.get(input-1)); 29 }else { 30 System.out.println("第"+input+"元素的前驱不存在"); 31 } 32 //4.后继元素 33 if (input>=0&&input<n-1) { 34 System.out.println("第"+input+"个元素的后继是:"+L.get(input+1)); 35 }else { 36 System.out.println("第"+input+"元素的后继不存在"); 37 } 38 } 39 }
结果为:
4.实现以删除单链表中的重复元素(去重)
1 package com.neusoft.exercise; 2 import com.neusoft.link.LinkedList; 3 import com.neusoft.link.Node; 4 5 /** 6 * @author zhao-chj 7 * 实现以删除单链表中的重复元素(去重) 8 * 1.初始化单链表,并用尾插法或者头插法赋值 9 * 2.显示插入元素的信息,使用display方法 10 * 3.实现删除重复节点方法 11 * 4.显示输出删除重复节点的值后的单链表 12 */ 13 public class TestLinearTable04 { 14 public static void main(String[] args) { 15 System.out.println("请输入单链表中的10 个节点的值~"); 16 //1.初始化单链表,并用for循环赋值 17 LinkedList L = new LinkedList(10,true);//true表示采用尾插法 18 System.out.println("插入之后单链表中的各个节点的值为:"); 19 L.display(); 20 //2.删除重复节点方法 21 removeRepeatElement(L); 22 //3.显示输出删除重复节点的值后的单链表 23 System.out.println("显示输出删除重复节点的值后的单链表:"); 24 L.display(); 25 } 26 27 private static void removeRepeatElement(LinkedList l) { 28 // TODO 删除重复节点方法 29 Node p =l.head.next;//p节点指向后继元素 30 Node q =null;//q节点指向前去元素 31 while(p!=null){//从头结点开始查找 32 int order = l.indexOf(p.data); 33 q=p.next; 34 while(q!=null){ 35 if ((p.data).equals(q.data)) { 36 l.remove(order+1); 37 }else { 38 order++; 39 } 40 q=q.next;//依次寻找后继节点相同的值 41 } 42 p=p.next;//依次拿后续的每个元素和内层循环的值进行对比 43 } 44 45 } 46 }
结果为:
注意:单链表的操作类务必不能出错,请参考以下代码
修改了display()方法,insert()方法(去掉了i==0的情况,因为linkedlist是带头结点的单链表)
1 package com.neusoft.link; 2 /** 3 * 带头结点的单链表 4 */ 5 import java.util.Scanner; 6 7 import com.neusoft.List.IList; 8 public class LinkedList implements IList { 9 public Node head;//链表的头指针 10 public LinkedList() { 11 head = new Node();//初始化头结点 12 } 13 public LinkedList(int n,boolean order){ 14 //如果order=1采用尾插法,如果order=2采用头插法 15 this(); 16 if (order) { 17 create1(n); 18 }else { 19 create2(n); 20 } 21 } 22 private void create1(int n) { 23 //尾插法 24 Scanner sc = new Scanner(System.in); 25 for (int i = 0; i < n; i++) { 26 insert(length(), sc.next()); 27 } 28 } 29 private void create2(int n) { 30 //头插法 31 Scanner sc = new Scanner(System.in); 32 for (int i = 0; i < n; i++) { 33 insert(0, sc.next()); 34 } 35 } 36 37 @Override 38 public void clear() { 39 //置空 40 head.data=null; 41 head.next=null; 42 } 43 44 @Override 45 public boolean isEmpty() { 46 // 判空 47 return head.next==null; 48 } 49 @Override 50 public int length() { 51 // 链表的长度 52 Node p = head.next; 53 int length=0; 54 while (p!=null) { 55 p=p.next; //指向后继节点 56 length++; 57 } 58 return length; 59 } 60 61 @Override 62 public Object get(int i) { 63 // 读取链表中第i个节点 64 Node p = head.next; 65 int j=0; 66 if (j>i||p==null) { 67 System.out.println("第"+i+"个元素不存在"); 68 } 69 while (p!=null&&j<i) {//从头结点开始查找,找到第i各节点或者p的指针域为空停止 70 p=p.next; 71 j++; 72 } 73 return p.data; 74 } 75 76 @Override 77 public void insert(int i, Object x) { 78 // 在第i个节点之前插入一个值为x的新节点 79 Node p = head; 80 int j=-1; 81 while (p!=null &&j<i-1) { 82 p=p.next; 83 j++; 84 } 85 if (j>i-1||p==null) { 86 System.out.println("插入位置不合法"); 87 } 88 Node s = new Node(x);//新开辟的s节点 89 //从链表中间或表尾进行插入 90 s.next=p.next; 91 p.next=s; 92 } 93 94 @Override 95 public void remove(int i) { 96 // 删除单链表的第i个节点 97 Node p = head; 98 int j=-1; 99 while (p.next!=null&&j<i-1) { 100 p=p.next; 101 j++; 102 } 103 if (j>i-1||p.next==null) { 104 System.out.println("删除位置不合法"); 105 } 106 p.next=p.next.next; 107 } 108 109 @Override 110 public int indexOf(Object x) { 111 // 查找值为x的位置 112 Node p = head.next; 113 int j=0; 114 while (p!=null&&!p.data.equals(x)) { 115 p= p.next; 116 j++; 117 } 118 if (p!=null) { 119 return j; 120 }else { 121 return -1; 122 } 123 } 124 125 @Override 126 public void display() { 127 // 输出单链表的所有节点 128 Node node = head.next; 129 while(node !=null){ 130 System.out.print(node.data+" "); 131 node=node.next; 132 } 133 System.out.println(); 134 } 135 @Override 136 public int remove(Object i) { 137 // TODO Auto-generated method stub 138 return 0; 139 } 140 141 142 }
4.合并两个单链表为一有序链表(链表的合并)
1 package com.neusoft.exercise; 2 3 import java.util.Scanner; 4 5 import com.neusoft.link.LinkedList; 6 import com.neusoft.link.Node; 7 8 /** 9 * @author zhao-chj 10 * 合并两个单链表为一有序链表 11 * 将两个有序的单链表LA(有m个元素)和LB(有n个元素),要求元素均已从小到大的升序排列 12 * 合并成一个有序的单链表LA 13 * 1.使用尾插法建立LA和LB两个单链表,初始化LA的个数m和LB的个数n需要用户输入 14 * 2.编写合并单链表为一个链表的算法,实现LA和LB其中的元素分别按从小到大顺序排列 15 * 3.核心思想为:归并两个按照值非递减排列的带头结点的单链表LA和LB,得到新的带头结点 16 * 的单链表LA,且LA也按照值的非递减顺序排列,返回LA作为最后结果。 17 * 作业:从大到小实现上述要求 18 */ 19 public class TestLinearTable05 { 20 public static void main(String[] args) { 21 int m=0,n=0; 22 //1.使用尾插法建立LA和LB两个单链表,初始化LA的个数m和LB的个数n需要用户输入 23 Scanner sc = new Scanner(System.in); 24 System.out.println("请输入LA链表的个数:"); 25 m = sc.nextInt(); 26 System.out.println("请按照非递减的顺序输入"+m+"个数字"); 27 LinkedList LA= new LinkedList(m,true); 28 System.out.println("请输入LB链表的个数:"); 29 n=sc.nextInt(); 30 System.out.println("请按照非递减的顺序输入"+n+"个数字"); 31 LinkedList LB= new LinkedList(n,true); 32 //2.编写合并单链表为一个链表的算法,实现LA和LB其中的元素分别按从小到大顺序排列 33 System.out.println("将单链表LA和LB归并后,新的单链表LA中各个节点为:"); 34 LinkedList LA_new=mergeList(LA,LB); 35 //3.核心思想为:归并两个按照值非递减排列的带头结点的单链表LA和LB,得到新的带头结点 36 //的单链表LA,且LA也按照值的非递减顺序排列,返回LA作为最后结果。 37 LA_new.display(); 38 } 39 40 private static LinkedList mergeList(LinkedList LA,LinkedList LB) { 41 // TODO 合并单链表的函数 42 Node pa=LA.head.next; 43 Node pb=LB.head.next; 44 Node pc=LA.head; 45 int da,db; 46 while(pa!=null&&pb!=null){ 47 da = Integer.valueOf(pa.data.toString()); 48 db = Integer.valueOf(pb.data.toString()); 49 if (da<=db) { 50 pc.next=pa;//将LA节点加入到新的LA节点中 51 pc=pa; 52 pa=pa.next;//如果da<db成立则pa指针依次后移 53 }else { 54 pc.next=pb;//将LB节点加入到新的LA节点中 55 pc=pb; 56 pb=pb.next;//如果da>db成立则pb指针依次后移 57 } 58 } 59 //如果LA和LB链表不相等的时候,需要将元素多的链表的剩余元素插入到新建立的LA中 60 pc.next=(pa!=null?pa:pb); 61 return LA; 62 } 63 }
涉及到的单链表数据结构类LinkedList
1 package com.neusoft.link; 2 /** 3 * 带头结点的单链表 4 */ 5 import java.util.Scanner; 6 7 import com.neusoft.List.IList; 8 public class LinkedList implements IList { 9 public Node head;//链表的头指针 10 public LinkedList() { 11 head = new Node();//初始化头结点 12 } 13 public LinkedList(int n,boolean order){ 14 //如果order=1采用尾插法,如果order=2采用头插法 15 this(); 16 if (order) { 17 create1(n); 18 }else { 19 create2(n); 20 } 21 } 22 private void create1(int n) { 23 //尾插法 24 Scanner sc = new Scanner(System.in); 25 for (int i = 0; i < n; i++) { 26 insert(length(), sc.next()); 27 } 28 } 29 private void create2(int n) { 30 //头插法 31 Scanner sc = new Scanner(System.in); 32 for (int i = 0; i < n; i++) { 33 insert(0, sc.next()); 34 } 35 } 36 37 @Override 38 public void clear() { 39 //置空 40 head.data=null; 41 head.next=null; 42 } 43 44 @Override 45 public boolean isEmpty() { 46 // 判空 47 return head.next==null; 48 } 49 @Override 50 public int length() { 51 // 链表的长度 52 Node p = head.next; 53 int length=0; 54 while (p!=null) { 55 p=p.next; //指向后继节点 56 length++; 57 } 58 return length; 59 } 60 61 @Override 62 public Object get(int i) { 63 // 读取链表中第i个节点 64 Node p = head.next; 65 int j=0; 66 if (j>i||p==null) { 67 System.out.println("第"+i+"个元素不存在"); 68 } 69 while (p!=null&&j<i) {//从头结点开始查找,找到第i各节点或者p的指针域为空停止 70 p=p.next; 71 j++; 72 } 73 return p.data; 74 } 75 76 @Override 77 public void insert(int i, Object x) { 78 // 在第i个节点之前插入一个值为x的新节点 79 Node p = head; 80 int j=-1; 81 while (p!=null &&j<i-1) { 82 p=p.next; 83 j++; 84 } 85 if (j>i-1||p==null) { 86 System.out.println("插入位置不合法"); 87 } 88 Node s = new Node(x);//新开辟的s节点 89 //从链表中间或表尾进行插入 90 s.next=p.next; 91 p.next=s; 92 } 93 94 @Override 95 public void remove(int i) { 96 // 删除单链表的第i个节点 97 Node p = head; 98 int j=-1; 99 while (p.next!=null&&j<i-1) { 100 p=p.next; 101 j++; 102 } 103 if (j>i-1||p.next==null) { 104 System.out.println("删除位置不合法"); 105 } 106 p.next=p.next.next; 107 } 108 109 @Override 110 public int indexOf(Object x) { 111 // 查找值为x的位置 112 Node p = head.next; 113 int j=0; 114 while (p!=null&&!p.data.equals(x)) { 115 p= p.next; 116 j++; 117 } 118 if (p!=null) { 119 return j; 120 }else { 121 return -1; 122 } 123 } 124 125 @Override 126 public void display() { 127 // 输出单链表的所有节点 128 Node node = head.next; 129 while(node !=null){ 130 System.out.print(node.data+" "); 131 node=node.next; 132 } 133 System.out.println(); 134 } 135 @Override 136 public int remove(Object i) { 137 // TODO Auto-generated method stub 138 return 0; 139 } 140 141 142 }
结果分析: