|
|
@ -1,326 +0,0 @@
|
|
|
|
单链表反转
|
|
|
|
|
|
|
|
使用while循环,保存next节点,设置当前节点的next,保存pre,移动head,最后返回pre
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
private static Node reverseLinkedList(Node head) {
|
|
|
|
|
|
|
|
Node pre = null;
|
|
|
|
|
|
|
|
Node next = null;
|
|
|
|
|
|
|
|
while (head != null) {
|
|
|
|
|
|
|
|
next = head.getNext();
|
|
|
|
|
|
|
|
head.setNext(pre);
|
|
|
|
|
|
|
|
pre = head;
|
|
|
|
|
|
|
|
head = next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return pre;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
双链表反转
|
|
|
|
|
|
|
|
使用while循环,保存next节点,设置当前节点的last和pre,保存pre,移动head,最后返回pre
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
private static Node reverDoubleLinkedList(Node head) {
|
|
|
|
|
|
|
|
Node pre = null;
|
|
|
|
|
|
|
|
Node next = null;
|
|
|
|
|
|
|
|
while (head != null) {
|
|
|
|
|
|
|
|
next = head.getLast();
|
|
|
|
|
|
|
|
head.setLast(pre);
|
|
|
|
|
|
|
|
head.setPre(next);
|
|
|
|
|
|
|
|
pre = head;
|
|
|
|
|
|
|
|
head = next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return pre;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
单链表实现队列和栈
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
public class CustomQueue<V> {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Node<V> head;
|
|
|
|
|
|
|
|
private Node<V> tail;
|
|
|
|
|
|
|
|
private int size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isEmpty(){
|
|
|
|
|
|
|
|
return size == 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void offer(V value) {
|
|
|
|
|
|
|
|
Node<V> node = new Node<>(value);
|
|
|
|
|
|
|
|
if (tail == null) {
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
tail = node;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
tail.setNext(node);
|
|
|
|
|
|
|
|
tail = node;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V poll(){
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
V ans = head.getValue();
|
|
|
|
|
|
|
|
head = head.getNext();
|
|
|
|
|
|
|
|
size--;
|
|
|
|
|
|
|
|
return ans;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V peek() {
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return head.getValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private class Node<V> {
|
|
|
|
|
|
|
|
private V value;
|
|
|
|
|
|
|
|
private Node<V> next;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V getValue() {
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setValue(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node<V> getNext() {
|
|
|
|
|
|
|
|
return next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setNext(Node<V> next) {
|
|
|
|
|
|
|
|
this.next = next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public boolean equals(Object o) {
|
|
|
|
|
|
|
|
if (this == o) return true;
|
|
|
|
|
|
|
|
if (o == null || getClass() != o.getClass()) return false;
|
|
|
|
|
|
|
|
Node<?> node = (Node<?>) o;
|
|
|
|
|
|
|
|
return value.equals(node.value) &&
|
|
|
|
|
|
|
|
next.equals(node.next);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public int hashCode() {
|
|
|
|
|
|
|
|
return Objects.hash(value, next);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
public class CustomStack<V> {
|
|
|
|
|
|
|
|
private Node<V> head;
|
|
|
|
|
|
|
|
private int size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isEmpty(){
|
|
|
|
|
|
|
|
return size == 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void push(V value){
|
|
|
|
|
|
|
|
Node<V> node = new Node<>(value);
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
node.setNext(head);
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V pop(){
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
V ans = null;
|
|
|
|
|
|
|
|
ans = head.getValue();
|
|
|
|
|
|
|
|
head.setNext(head.getNext());
|
|
|
|
|
|
|
|
size--;
|
|
|
|
|
|
|
|
return ans;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V peek() {
|
|
|
|
|
|
|
|
return head == null ? null : head.getValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Node<V>{
|
|
|
|
|
|
|
|
private V value;
|
|
|
|
|
|
|
|
private Node<V> next;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V getValue() {
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setValue(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node<V> getNext() {
|
|
|
|
|
|
|
|
return next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setNext(Node<V> next) {
|
|
|
|
|
|
|
|
this.next = next;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public boolean equals(Object o) {
|
|
|
|
|
|
|
|
if (this == o) return true;
|
|
|
|
|
|
|
|
if (o == null || getClass() != o.getClass()) return false;
|
|
|
|
|
|
|
|
Node<?> node = (Node<?>) o;
|
|
|
|
|
|
|
|
return Objects.equals(value, node.value) &&
|
|
|
|
|
|
|
|
Objects.equals(next, node.next);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public int hashCode() {
|
|
|
|
|
|
|
|
return Objects.hash(value, next);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 使用双链表实现双端队列
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```Java
|
|
|
|
|
|
|
|
public class CustomDeque<V> {
|
|
|
|
|
|
|
|
private Node<V> head;
|
|
|
|
|
|
|
|
private Node<V> tail;
|
|
|
|
|
|
|
|
private int size;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean isEmpty() {
|
|
|
|
|
|
|
|
return size == 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void pushHead(V value){
|
|
|
|
|
|
|
|
Node<V> node = new Node<>(value);
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
tail = node;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
node.setLast(head);
|
|
|
|
|
|
|
|
head.setPre(node);
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void pushTail(V value){
|
|
|
|
|
|
|
|
Node<V> node = new Node<>(value);
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
head = node;
|
|
|
|
|
|
|
|
tail = node;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
tail.setLast(node);
|
|
|
|
|
|
|
|
node.setPre(tail);
|
|
|
|
|
|
|
|
tail = node;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V pollHead(){
|
|
|
|
|
|
|
|
if (head == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
V ans = head.getValue();
|
|
|
|
|
|
|
|
if (head.equals(tail)) {
|
|
|
|
|
|
|
|
head = null;
|
|
|
|
|
|
|
|
tail = null;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
head = head.getLast();
|
|
|
|
|
|
|
|
head.setPre(null);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size--;
|
|
|
|
|
|
|
|
return ans;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V pollTail(){
|
|
|
|
|
|
|
|
if (tail == null) {
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
V ans = tail.getValue();
|
|
|
|
|
|
|
|
if (head.equals(tail)) {
|
|
|
|
|
|
|
|
head = null;
|
|
|
|
|
|
|
|
tail = null;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
tail = tail.getPre();
|
|
|
|
|
|
|
|
tail.setLast(null);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
size--;
|
|
|
|
|
|
|
|
return ans;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V peekHead(){
|
|
|
|
|
|
|
|
return head == null ? null : head.getValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V peekTail(){
|
|
|
|
|
|
|
|
return tail == null ? null : tail.getValue();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Node<V>{
|
|
|
|
|
|
|
|
private V value;
|
|
|
|
|
|
|
|
private Node<V> last;
|
|
|
|
|
|
|
|
private Node<V> pre;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public V getValue() {
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setValue(V value) {
|
|
|
|
|
|
|
|
this.value = value;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node<V> getLast() {
|
|
|
|
|
|
|
|
return last;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setLast(Node<V> last) {
|
|
|
|
|
|
|
|
this.last = last;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Node<V> getPre() {
|
|
|
|
|
|
|
|
return pre;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void setPre(Node<V> pre) {
|
|
|
|
|
|
|
|
this.pre = pre;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public boolean equals(Object o) {
|
|
|
|
|
|
|
|
if (this == o) return true;
|
|
|
|
|
|
|
|
if (o == null || getClass() != o.getClass()) return false;
|
|
|
|
|
|
|
|
Node<?> node = (Node<?>) o;
|
|
|
|
|
|
|
|
return Objects.equals(value, node.value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
|
|
public int hashCode() {
|
|
|
|
|
|
|
|
return Objects.hash(value);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
单链表和双链表的新增、删除,主要注意处理好前驱和后继指针,必要的时候添加中间变量保存。双链表注意处理头尾重合、为空的边界条件。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
K个节点的组内逆序调整
|
|
|
|
|