java数据结构和算法------线性表(链表结构)

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 }

 

你可能感兴趣的:(java)