快慢指针原理--快速找到未知长度单链表的中间节点

package com.java.dataStruct;

//节点类
public class Node<E> {
    
    E item;
    Node next;
    public Node(){
    }
    public Node(E element){
        this.item = element;
    }
    public Node(E element, Node next){
        this.item = element;
        this.next = next;
    }
    

}
     Node p1,r1;
        
        Node L1 = new Node<String>("head");
        r1 = L1;
        
        // 先利用尾插法创建一个链表
        for(int i=1; i<=20; i++){
            p1 = new Node<String>();
            p1.item = "value"+i;
            
            r1.next = p1;
            r1 = p1;
        }
        r1.next = null;
        
        
//        while(L1.next != null){
//            //System.out.p1r1intln(L.item);
//            System.out.println(L1.next.item);
//            L1 = L1.next;
//        }
  
        
        /*
         * 快速找到未知长度单链表的中间节点
         * 
         * 快慢指针原理
         * 设置两个指针 search,mid都指向单链表的头节点。
         * 其中search的移动速度是mid的2倍。
         * 当search指向末尾节点的时候,mid正好就在中间了。
         */
        Node search,mid;
        search = L1;
        mid = L1;
        for(;search.next != null;){
            if(search.next.next != null){
                search = search.next.next;
                mid = mid.next;
            }else{
                search = search.next;
            }
        }
        System.out.println("结果: "+mid.item);

 

转载于:https://www.cnblogs.com/wwzyy/p/6111636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用双指针法,一个指针指向当前节点,另一个指针指向当前节点的下一个节点。如果当前节点的值等于下一个节点的值,则将下一个节点删除,否则将当前节点指向下一个节点。重复这个过程直到链表末尾。最后返回头节点即可。 ### 回答2: 在删除元素非递减的单链表中的重复元素这个问题中,我们需要做的是遍历整个链表,并判断当前节点和下一个节点是否值相同。如果值相同,则将当前节点的next指针指向下一个节点的next指针,同时释放下一个节点的内存空间。如果值不同,则继续遍历下一个节点。 具体实现时,我们可以这样做: 1. 遍历整个链表,从头节点开始,判断当前节点和下一个节点是否值相同。 2. 如果值相同,则执行以下步骤: 1)将当前节点的next指针指向下一个节点的next指针。 2)释放下一个节点的内存空间。 3)将当前节点不动,继续判断当前节点的值是否与下一个节点的值相同。 3. 如果值不同,则将当前节点指向下一个节点,继续遍历下一个节点。 4. 遍历直到链表的尾节点,遍历结束。 这样就能够删除元素非递减的单链表中的重复元素了。 需要注意的是,删除节点时需要先将节点的next指针指向下一个节点的next指针,再释放下一个节点的内存空间,否则会出现内存泄漏的问题。同时,在判断节点值是否相同时,应该使用等于号(==)而不是赋值操作(=),否则会改变节点的值。 ### 回答3: 题目描述: 给定一个非递减的单链表,你需要删除重复的元素。 例如:链表 1 -> 1 -> 2 -> 3 -> 3,删除后变为 1 -> 2 -> 3。 解题思路: 根据题目要求,我们需要将非递减的单链表中的重复元素删除,由于链表是非递减的,因此如果当前节点的值和下一个节点的值相等,则说明存在重复,我们只需要将下一个节点删除即可。 在处理完一段连续的重复元素后,重新连接链表。 这道题可以使用两种方法解决,第一种是使用递归,第二种是使用迭代。 方法一:递归 使用递归的思想,先判断当前节点和下一个节点的值是否相等,如果相等,就将下一个节点删除,然后继续递归,直到没有重复为止。 方法二:迭代 使用迭代的思想,先设置当前指针为头节点,然后循环遍历链表,判断当前节点和下一个节点的值是否相等,如果相等,则删除下一个节点,将当前指针指向下一个节点,如果不相等,则将当前指针移动到下一个节点。 代码实现: 方法一:递归 public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } if (head.val == head.next.val) { head.next = head.next.next; return deleteDuplicates(head); } else { head.next = deleteDuplicates(head.next); return head; } } 方法二:迭代 public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } ListNode cur = head; while (cur != null && cur.next != null) { if (cur.val == cur.next.val) { cur.next = cur.next.next; } else { cur = cur.next; } } return head; } 总结: 本题是链表操作的经典题目,多数面试中都会考到,需要掌握递归和迭代两种解题方法,同时还需要注意链表指针的操作,根据不同的操作要求进行指针重定向,才能达到删除重复元素的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值