# 算法通关2.数组和链表

#### 练习

1. leetcode206反转链表

``````输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
``````

思路:定义俩个变量,记录当前节点和上一个节点,采用俩数交换的方式进行反转

``````class Solution {
ListNode prev = null;
ListNode tempNext = null;
while (cur != null) {
tempNext = cur.next;
cur.next = prev;
prev = cur;
cur = tempNext;
}
return prev;
}
}
``````
2. leetcode24两两交互链表中的节点

``````给定 1->2->3->4, 你应该返回 2->1->4->3.
``````

递归解乏

``````    public static ListNode swapPairs(ListNode head) {
}
return next;
}
``````

非递归解法

``````    public static ListNode swapPairs2(ListNode head) {
ListNode prev = new ListNode(0);
ListNode temp = prev;
while (temp.next != null && temp.next.next != null) {
ListNode start = temp.next;
ListNode end = temp.next.next;
temp.next = end;
start.next = end.next;
end.next = start;
temp = start;
}
return prev.next;
}
``````
3. 环形链表

给定一个链表，判断链表中是否有环。

``````输入：head = [3,2,0,-4], pos = 1
输出：true
解释：链表中有一个环，其尾部连接到第二个节点。
``````
img

1. 硬做(在0.5s内判断会不会走到null,性能很差)

2. 把走过的节点放到set中,每到新节点判断set中有没有进行判重,时间复杂度O(n)

``````    public boolean hasCycle(ListNode head) {
Set<ListNode> nodes = new HashSet<>();
return true;
}
}
return false;
}
``````
3. 龟兔赛跑式(快慢指针),快指针每次走俩步,慢指针每次走一步,快慢相遇说明有环

``````    public boolean hasCycle(ListNode head) {
return false;
}