1.链表中环的入口结点
public class Solution{
public ListNode EntryNodeOfLoop(ListNode pHead){
if(pHead==null||pHead.next==null) return null;
ListNode slow=pHead;
ListNode fast=pHead;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
fast=pHead;
while(fast!=slow){
fast=fast.next;
slow=fast.next;
}
if(fast==slow) return slow;
}
}
return null;
}
}
思路:1.初始化:快指针fast指向头结点,慢指针slow指向头结点。
2.让fast一次走两步,slow一次走一步,第一次相遇在c处,停止
3.然后让fast指向头结点,slow原地不动,让后fast,slow每次走一步,当再次相遇,就是入口节点。
2.删除链表中重复的结点
```java
public class Solution{
public ListNode deleteDuplication(ListNode pHead){
if(pHead==null) return null;
ListNode first=new ListNode(-1);
first.next=pHead;
ListNode p=pHead;
ListNode preNode=first;
while(p!=null&&p.next!=null){
if(p.val==p.next.val){
int val=p.val;
while(p!=null&&p.val==val){
p=p.next;
}
preNode.next=p;
}else{
preNode=p;
p=p.next;
}
}
return first.next;
}
}
思路:1.初始化:上一个不重复的节点prepHead,当前节点pThis,下个节点pNext.
2.遍历pThis的时候,如果当前节点pThis的值跟后面的几个节点数值相同,需要找到下个不同的节点,删除重复节点,更新prepHead和pThis;
3.如果前节点pThis的值跟后面的节点数值不同,直接更新prepHead和pThis.
4.如果prepHead就是重复,需要更新prepHead。