1 package iYou.neugle.list;
2
3 // 链表数据结构
4 public class Node<T> {
5 // 该节点的值
6 public T data;
7 // 该节点指向的下一个节点
8 public Node<T> next;
9 }
1 package iYou.neugle.list;
2
3 public class MyChainList<T> {
4 // 向链表尾部添加元素
5 public Node<T> AddEnd(Node<T> head, T data) {
6 Node<T> node = new Node<T>();
7 node.data = data;
8 if (head == null) {
9 head = node;
10 return head;
11 }
12 SearchEnd(head).next = node;
13 return head;
14 }
15
16 private Node<T> SearchEnd(Node<T> head) {
17 if (head.next == null) {
18 return head;
19 }
20 return SearchEnd(head.next);
21 }
22
23 // 向链表头部添加元素
24 public Node<T> AddHead(Node<T> head, T data) {
25 Node<T> node = new Node<T>();
26 node.data = data;
27 Node<T> nodeCopy = DeepCopy(head, new Node<T>());
28 node.next = nodeCopy;
29
30 head.data = node.data;
31 head.next = node.next;
32 return head;
33 }
34
35 private Node<T> DeepCopy(Node<T> head, Node<T> node) {
36 if (head != null) {
37 node.data = head.data;
38 node.next = head.next;
39 } else {
40 return null;
41 }
42 DeepCopy(head.next, node.next);
43 return node;
44 }
45
46 // 向链表中插入数据
47 public Node<T> Insert(Node<T> head, T key, T data) {
48 if (head.next == null) {
49 return null;
50 }
51
52 if (head.data.equals(key)) {
53 return AddHead(head, data);
54 }
55
56 if (head.next.data.equals(key)) {
57 Node<T> node = new Node<T>();
58 node.data = data;
59 node.next = head.next;
60 head.next = node;
61 return head;
62 }
63 Insert(head.next, key, data);
64 return head;
65 }
66
67 // 向链表中删除数据
68 public Node<T> Delete(Node<T> head, T key) {
69 if (head.next == null) {
70 return null;
71 }
72
73 if (head.data.equals(key)) {
74 head.data = head.next.data;
75 head.next = head.next.next;
76 return head;
77 }
78
79 if (head.next.data.equals(key)) {
80 head.next = head.next.next;
81 return head;
82 }
83 Delete(head.next, key);
84 return head;
85 }
86
87 // 按关键字查找节点
88 public void Search(Node<T> head, T key) {
89 if (head.data.equals(key)) {
90 System.out.println("查询节点为头结点,节点值为:" + key);
91 return;
92 }
93 while (head.next != null) {
94 if (head.next.data.equals(key)) {
95 System.out.print("查询节点为:" + key + ",");
96 System.out.print("查询节点前置节点为:" + head.data + ",");
97 if (head.next.next != null) {
98 System.out.println("查询节点后置节点为:" + head.next.next.data);
99 } else {
100 System.out.println("查询节点为尾节点!");
101 }
102 return;
103 }
104 head = head.next;
105 }
106 System.out.println("没有该节点!");
107 }
108
109 // 获取链表长度
110 public int SizeOf(Node<T> head) {
111 // 如果没有节点,返回-1
112 if (head == null) {
113 return -1;
114 }
115 int n = 1;
116 while (head.next != null) {
117 n++;
118 head = head.next;
119 }
120 return n;
121 }
122
123 public void Print(Node<T> head) {
124 while (head != null) {
125 System.out.println(head.data);
126 head = head.next;
127 }
128 }
129 }