字符串题(2021-6-30)

本文详细解析了两个链表问题:一是如何寻找链表中环的入口节点;二是如何删除链表中的重复节点。通过具体代码实现展示了算法设计思想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;//让fast指向头结点
      while(fast!=slow){
            fast=fast.next;
            slow=fast.next;
        }
        if(fast==slow) return slow;//当fast=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;//定义p指向头节点
   ListNode preNode=first;//头节点的前一个节点为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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值