141题其实就是判断链表是否有环
判断时候有环(链表头指针为head)
对于这个问题我们可以采用“快慢指针”的方法。就是有两个指针fast和slow,开始的时候两个指针都指向链表头head,然后在每一步
操作中slow向前走一步即:slow = slow->next,而fast每一步向前两步即:fast = fast->next->next。
由于fast要比slow移动的快,如果有环,fast一定会先进入环,而slow后进入环。当两个指针都进入环之后,经过一定步的操作之后
二者一定能够在环上相遇,并且此时slow还没有绕环一圈,也就是说一定是在slow走完第一圈之前相遇。
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while ((fast != null) && (fast.next != null)) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast)
return true;
}
return false;
}
}
83题就是将有序链表中的重复结点去了
很简单,就不废话了
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null) return null;
ListNode res = new ListNode(head.val);
ListNode node = res;
head = head.next;
while(head != null){
if(node.val != head.val){
node.next = new ListNode(head.val);
node = node.next;
}
head = head.next;
}
return res;
}
}
目标:每天一道算法题。
时间:2019-5-30
已完成:4道