链表操作

链表操作

判断单链表是否有环

第一种方式,我们可以使用快慢指针的形式

* 开始,快慢指针都指向头结点,快指针每次都两步,慢指针每次走一步
     * 如果存在环,则在运行中,无论运行了几圈,快慢指针肯定会相等,也就是指向同一个位置
     * 除此之外,还有另一种解题方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.data.LinkListDemo;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class LinkedListDemo {


//判断一个单链表中是否有环
/**
* 第一种方式,我们可以使用快慢指针的形式
* 开始,快慢指针都指向头结点,快指针每次都两步,慢指针每次走一步
* 如果存在环,则在运行中,无论运行了几圈,快慢指针肯定会相等,也就是指向同一个位置
* 除此之外,还有另一种解题方式
* @param head
* @return
*/
public boolean hasCycle(ListNode head) {
ListNode first = head;
ListNode slow = head;
while (first != null && first.next!=null) {
first = first.next.next;
slow = slow.next;
if (first == slow) {
return true;
}
}
return false;
}

//可以使用一个set集合,存放遍历过的节点,如果下次遍历时存在同样的节点,则证明该单链表中存在环
public boolean hasCycle2(ListNode head) {
Set<ListNode> set = new HashSet<>();
ListNode temp = head;
while (temp != null) {
if (set.contains(temp)){
return true;
}
set.add(temp);
temp = temp.next;
}
return false;
}

判断链表有环,并找出入环的第一个节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

//判断链表有环,并找出入环的第一个节点

/**
* 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
* 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
* 如果 pos 是 -1,则在该链表中没有环。
*
* 输入:head = [3,2,0,-4], pos = 1
* 输出:tail connects to node index 1
* 解释:链表中有一个环,其尾部连接到第二个节点。
*
* 主要解题思路
* 1,首先是使用快慢指针找出链表中存在环的指针位置
* 2,指针执行当前快慢指针相交的位置 cur
* 3. 另一个mo指针从头结点开始向后遍历 mo
* 4. 当 cur与mo相等,即当前位置为入环的位置
*/
public ListNode hasCyclePlace(ListNode listNode) {
ListNode first = listNode;
ListNode slow = listNode;
ListNode cur = null;
ListNode mo = listNode;
while (first != null && first.next != null) {
first = first.next.next;
slow = slow.next;
if (first == slow) {
cur = slow;
break;
}
}
if (cur != null) {
while (cur != mo) {
cur = cur.next;
mo = mo.next;
}
}
return cur;
}


}

判断一个数组是不是二叉树的后序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.data;

public class verifySquenceBST {
public static void main(String[] args) {
int[] array = {5,7,6,9,11,10,8};
boolean b = verfySequenceofBST(array, array.length);
System.out.println(b);

}

//给定一个数组,判断这个数组是不是二叉搜索树的后序遍历
public static boolean verfySequenceofBST(int[] array, int length){
if (array == null || length < 0) {
return false;
}
int root = array[length - 1];//树的根节点
int i = 0;
for (; i < length-1; i++) {
if (array[i] > root) {
break;
}
}
for (int j = i; j < length-1; j++) {
if (array[j] < root) {
return false;
}
}
boolean left =true;
if (i > 0) {
left = verfySequenceofBST(array, i);
}
boolean right = true;
if (i<length-1){
right = verfySequenceofBST(array, length - i - 1);
}
return left&&right;
}
}
单例模式
饿汉式
1
2
3
4
5
6
7
8
9
10
11

package com.data.sheji;

public class SingleInstance {
private static SingleInstance singleInstance = new SingleInstance();
private SingleInstance(){}

private static SingleInstance getSingleInstance(){
return singleInstance;
}
}

懒汉式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.data.sheji;

//懒汉式
public class SingleInstance2 {
private static SingleInstance2 singleInstance = null;
private SingleInstance2(){}

private static SingleInstance2 getInstance(){
if (singleInstance == null) {
return new SingleInstance2();
}
return singleInstance;
}
}

双重验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

package com.data.sheji;

//双重验证
public class SingleInstance3 {
private static SingleInstance3 singleInstance3 = null;

public static void SingleInstance3(){}

public static SingleInstance3 getInstance3(){
if (singleInstance3 == null) {
synchronized (SingleInstance3.class) {
if (singleInstance3 == null) {
return new SingleInstance3();
}
}
}
return singleInstance3;
}
}

class SingleInastance4{
private static void SingleInastance4(){}
private static class SingleHolder{
private static SingleInastance4 singleInastance = new SingleInastance4();
}

public static SingleInastance4 getInstance(){
return SingleHolder.singleInastance;
}

}

本文标题:链表操作

文章作者:雷凯博

发布时间:2020年06月12日 - 20:06

最后更新:2021年05月16日 - 19:05

原始链接:http://yoursite.com/2020/06/12/%E9%93%BE%E8%A1%A8%E6%93%8D%E4%BD%9C/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
0%