单向链表(SinglyLinkedList)的实现【java】
Singly linked lists contain nodes which have a data field as well as a next field, which points to the next node in the linked list.
--from wikipedia(http://en.wikipedia.org/wiki/Linked_list)
链表中的节点Node,包含一个数据域和一个指针域,指向下一个链表结点。
链表的结点包含二个域:
1)数据域,当前结点的值
2)指针域,指向下一个结点
在链表中,因为要涉及到插入一个值到指定的值的前面或者后面,所以我们就要比较结点,所以要重写结点Node的hashCode和equals方法,用于比较Node对象的数据域。
Node
1 package com.matrix.linkedlist;
2
3 //链表的结点
4 public class Node<T> {
5
6 //结点的数据域
7 public T data;
8
9 //结点的指针域
10 public Node<T> next;
11
12 public boolean equals(Node<T> node){
13 if(data.equals(node.data)){
14 return true;
15 }
16 return false;
17 }
18
19 public int hashCode(){
20 return data.hashCode();
21 }
22 }
链表封装类
链表的一些操作,主要是针对结点之间的操作,一般只是修改结点之间的指针指向。
在此,对链表插入元素到头部用图片说明,其他操作类似。
SinglyLinkedList
1 package com.matrix.linkedlist;
2
3 public class SinglyLinkedList<T> {
4
5 // 链表的头指针
6 private Node<T> head;
7
8 public SinglyLinkedList() {
9 this.head = new Node<T>();
10 }
11
12 // 添加元素到链表的头部
13 public void addToHead(T data) {
14
15 Node<T> node = new Node<T>();
16 node.data = data;
17 if (null == head.next) {
18 head.next = node;
19 } else {
20 node.next = head.next;
21 head.next = node;
22 }
23 }
24
25 // 添加元素到链表的尾部
26 public void addToTail(T data) {
27 Node<T> node = new Node<T>();
28 node.data = data;
29 getLastNode(this.head).next = node;
30 }
31
32 // 获取链表的最后一个元素
33 public Node<T> getLastNode(Node<T> head) {
34 if (null == head.next) {
35 return head;
36 } else {
37 return getLastNode(head.next);
38 }
39 }
40
41 // 获取链表的长度
42 public int getLength() {
43 int length = 0;
44 if (null != head) {
45 Node<T> node = head;
46 while (null != node.next) {
47 length++;
48 node = node.next;
49 }
50 }
51 return length;
52 }
53
54 // 删除某个元素
55 public void delete(T data) {
56 Node<T> node = head;
57 while(null!=node&&null!=node.next){
58 if(node.next.data.equals(data)){
59 node.next=node.next.next;
60 }
61 node=node.next;
62 }
63 }
64
65 //插入元素到指定的元素之后
66 public void insertAfter(T data,T key){
67 Node<T> node = head;
68 Node<T> insNode= new Node<T>();
69 insNode.data=data;
70 while(null!=node&&null!=node.next){
71 if(node.next.data.equals(key)){
72 insNode.next=node.next.next;
73 node.next.next=insNode;
74 break;
75 }
76 node=node.next;
77 }
78 }
79 //插入元素到指定的元素之后
80 public void insertBefore(T data,T key){
81 Node<T> node = head;
82 Node<T> insNode= new Node<T>();
83 insNode.data=data;
84 while(null!=node&&null!=node.next){
85 if(node.next.data.equals(key)){
86 insNode.next=node.next;
87 node.next=insNode;
88 break;
89 }
90 node=node.next;
91 }
92 }
93
94 //遍历链表元素,打印数据域
95 public void printData(){
96 Node<T> node = this.head;
97 while(null!=node.next){
98 System.out.print(node.next.data+"-->");
99 node=node.next;
100 }
101 System.out.println();
102 }
103 }
链表测试类
SinglyLinkedListTest
1 package com.matrix.linkedlist;
2
3 import org.junit.Test;
4
5 public class SinglyLinkedListTest {
6
7 @Test
8 public void test() {
9 SinglyLinkedList<Integer> singlyLinkedList = new SinglyLinkedList<Integer>();
10 for (int i = 1; i < 6; i++) {
11 singlyLinkedList.addToHead(i);
12 }
13 singlyLinkedList.printData();
14 for (int i = 7; i < 13; i++) {
15 singlyLinkedList.addToTail(i);
16 }
17 singlyLinkedList.printData();
18 singlyLinkedList.delete(15);
19 singlyLinkedList.printData();
20 singlyLinkedList.insertAfter(22, 4);
21 singlyLinkedList.printData();
22 singlyLinkedList.insertBefore(21, 4);
23 singlyLinkedList.printData();
24 }
25 }
一步一步往上爬......