手写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; } } }
相关文章推荐
- LeetCode:Linked List Cycle--链表快慢指针实现求链表中位和查找链表中是否存在环
- Leetcode Reverse Linked List II 反转特定区间的链表
- 141.leetcode Linked List Cycle(easy)[链表是否有环 快慢指针]
- leetcode 92. Reverse Linked List II 反转链表 + 头插入反转链表(或者使用栈)
- 判断链表是否有环 Linked List Cycle
- Linked List Cycle:判断链表是否有环
- 链表-Reverse Linked List(反转单向链表)
- [Leetcode] Reverse linked list ii 反转链表
- [LeetCode] Reverse Linked List(递归与非递归反转链表)
- [分析总结:leetcode-Palindrome Linked List] 给定单链表,判断链表是否为回文。
- [LeetCode]93. Linked List Cycle II查找链表中环的起始节点
- [leetcode 141] Linked List Cycle----判断链表是否为循环链表
- leetcode:Reverse Linked List II (反转链表中的一部分)【面试算法题】
- 如何判断一个单向链表是否为回文链表(Palindrome Linked List)
- pat甲级1074. Reversing Linked List (25)、乙级1025. 反转链表 (25)
- C#LeetCode刷题之#206-反转链表(Reverse Linked List)
- LeetCode.206. Reverse Linked List(反转有序链表)
- leetCode-linkedListCycle判断链表是否有环
- [LeetCode-206] Reverse Linked List(链表反转)
- 【LeetCode-面试算法经典-Java实现】【092-Reverse Linked List II(反转单链表II)】