您的位置:首页 > 其它

手写LinkedList,链表反转,查找是否有环。

2019-05-13 12:43 232 查看
package com.lxh.structure;

import java.util.HashSet;
import java.util.Set;

public class LinkedListM<T extends Comparable> {

public Node<T> getHead() {
return head;
}

private Node<T> head = null;

public Node findByValue(T t){
Node p = head;
while (p != null && !p.t.equals(t)){
p = p.next;
}
return p;
}

public Node findByIndex(int index){
Node p = head;
int pos = 0;
while (pos != index && p != null){
p = p.next;
pos ++;
}
return p;
}

public void insertHead(T t){
Node node = new Node(t, null);
this.insertHead(node);
}

public void insertHead(Node node) {
if (head == null){
head = node;
}else{
node.next = head;
head = node;
}
}

public void insertToTail(T t){
Node node = new Node(t, null);
this.insertToTail(node);
}

private void insertToTail(Node newNode) {
if (head == null){
head = newNode;
}else{
Node node = head;
while(node.next != null){
node = node.next;
}
newNode.next = node.next;
node.next = newNode;
}

}

public void insertAfter(Node p, T t) {
Node newNode = new Node(t, null);
insertAfter(p, newNode);
}

public void insertAfter(Node p, Node newNode) {
if (p == null) return;

newNode.next = p.next;
p.next = newNode;
}

public void insertBefore(Node p, T t) {
Node newNode = new Node(t, null);
insertBefore(p, newNode);
}

public void insertBefore(Node p, Node newNode) {
if (p == null) return;
if (p == head) {
newNode.next = head;
head = newNode;
}else{
Node node = head;
while (node.next != p && node != null){
node = node.next;
}
if (node == null){
return;
}else{
newNode.next = node.next;
node.next = newNode;
}
}

newNode.next = p.next;
p.next = newNode;
}

public void removeNode(Node node){
if (node == null){
return;
}
if (node == head){
head = null;
}else{
Node preNode = head;
while(preNode != null && preNode.next != node){
preNode = node.next;
}
if (preNode == null){
return;
}else{
preNode.next = preNode.next.next;
}

}
}

public void removeNode(T t){
if (t == null){
return;
}
Node<T> node = new Node(t, null);
if (t.equals(head.t)){
node = head;
head = head.next;
}else{
Node preNode = head;

while(preNode != null && !t.equals(preNode.next.t)){
preNode = node.next;
}
if (preNode == null){
return;
}else{
node = preNode.next;
preNode.next = preNode.next.next;
}

}
}

public void printAll(){
Node node = head;
if (node == null){
System.out.println("linkedList size is 0.");
}else{
while(node != null){
System.out.print(node.getData().toString() + "\t");
node = node.next;
}
}
System.out.println();
}

//-----------------------------------------------------------------------//
// 反转链表
public Node reverse(Node list){
Node cur = list; Node pre = null;

while (cur != null){
Node next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}

public Node reverse() {
return this.reverse(this.head);
}

// 查找链表是否有环 方法一:一直查找直到下一个为null
public boolean hasCycle1(Node node){
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
while((end - start) < 1000){
if (node == null){
return false;
}
node = node.next;
end = System.currentTimeMillis();
}
return true;
}

public boolean hasCycle1(){
return this.hasCycle1(head);
}

// 查找链表是否有环 查看是否有重复的node存放到set中
public boolean hasCycle2(Node node){
Set<Node> set = new HashSet<>();
while(node != null){
if (set.contains(node)){
return true;
}
set.add(node);
node = node.next;
}
return false;
}

public boolean hasCycle2() {
return this.hasCycle1(head);
}

// 查找链表是否有环 查看是否有重复的node存放到set中
public boolean hasCycle3(Node node){

if (node == null || node.next == null){
return true;
}
Node fast = node;
Node slow = node;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if (fast == slow){
return true;
}
}
return false;
}

public boolean hasCycle3(){
return this.hasCycle1(head);
}

public LinkedListM creatCycle(){
Node<String> node = new Node<>("1",null );
this.insertHead(node);
Node<String> node2 = null;
for (int i = 0; i < 30; i++) {
node2 = new Node<String>(new Integer(i).toString(),null );
this.insertToTail(node2);
}
node2.next = node.next.next;
return this;
}

// 将两个有序链表合并
public static Node mergeSortedList(Node s1, Node s2){
if (s1 == null){
return s2;
}
if (s2 == null){
return s1;
}
Node p = s1;
Node q = s2;
Node head = null;
if (p.t.compareTo(q.t) == -1){
head = p;
p = p.next;
}else{
head = q;
q = q.next;
}
Node r = head;
while(p != null && q != null){
if (p.t.compareTo(q.t) == -1){
r.next = p;
p = p.next;
}else{
r.next = q;
q = q.next;
}
r = r.next;
}
if (p != null){
r.next = p;
}
if (q != null){
r.next = q;
}
return head;
}

public static Node mergeSortedList(LinkedListM listM1, LinkedListM listM2){
return mergeSortedList(listM1.getHead(), listM2.getHead());
}

public static class Node<T extends Comparable>{
private T t;
private Node<T> next;

public Node(T t, Node next){
this.t = t;
this.next = next;
}

public T getData(){
return t;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: