1、Java实现单链表
package com.算法练习.链表;
public class SingleLinkedList<E> {
private Node head=new Node();
int size;
public boolean add(int index,E element){
CheckIndex(index);
Node p=head;
Node<E> newnode = new Node<>(null,element);
for (int i = 0; i < index; i++) {
p=p.next;
}
newnode.next=p.next;
p.next=newnode;
size++;
return true;
}
public boolean add(E element){
return add(size,element);
}
public E get(int index){
CheckIndex(index);
Node p=head;
for (int i = 0; i <=index; i++) {
p=p.next;
}
return (E) p.data;
}
public void update(int index,E element){
CheckIndex(index);
Node p=head;
for (int i = -1; i < index; i++) {
p=p.next;
}
p.data=element;
}
public void remove(int index){
CheckIndex(index);
Node p=head;
for (int i = -1; i < index-1; i++) {
p=p.next;
}
p.next=p.next.next;
size--;
}
public String toString(Node head) {
StringBuilder builder = new StringBuilder();
builder.append("[");
Node p = head.next;
while (p != null) {
if (p.next == null) {
builder.append(p.data);
} else {
builder.append(p.data + "->");
}
p = p.next;
}
builder.append("]");
return builder.toString();
}
}
class Node<E>{
Node next;
E data;
public Node() {
}
public Node(Node next, E data) {
this.next = next;
this.data = data;
}
}
2、单链表反转
public void reverseList(Node head){
Node newHead = new Node();
Node node=null;
Node p = head;
while(p!=null){
node = p.next;
p.next=newHead.next;
newHead.next=p;
p=node;
}
head.next=newHead.next;
}
3、查找单链表中倒数第k个结点
public E SearchK(int k){
CheckIndex(k);
Node p=head;
int count=0;
E element = null;
while(p!=null){
if(count==(size-k)){
element= (E) p.data;
break;
}
count++;
p=p.next;
}
return element;
}
4、逆序打印单链表
public void Reverse(){
Node p=head.next;
if(p==null){
return;
}
Stack<E> stack = new Stack<>();
while(p!=null){
stack.push((E) p.data);
p=p.next;
}
while (stack.size() > 0) {
System.out.println(stack.pop());
}
}
5、合并两个有序的单链表,合并之后依然有序
(1)迭代法
public Node SortLinked(Node head1, Node head2) {
Node<Integer> integerNode = new Node<>();
Node p3=integerNode;
Node p1 = head1.next;
Node p2 = head2.next;
while (p1 != null && p2 != null) {
Integer data1 = (Integer) p1.data;
Integer data2 = (Integer) p2.data;
if (data1 >= data2) {
p3.next=p2;
p2 = p2.next;
} else {
p3.next=p1;
p1 = p1.next;
}
p3=p3.next;
}
if(p1!=null){
p3.next=p1;
}
if(p2!=null){
p3.next=p2;
}
return integerNode;
}