【数据结构重要】查找中间节点---快慢指针法和统计链表长度法

查找单链表中间节点

问题描述:

输入:1->2->3->4->5

输出:3->4->5

输入:1->2->3->4->5->6

输出:4->5->6

问题思路:

长度为奇数:1->2->3->4->5 那么中心节点就为第三个节点 length/2+1

长度为偶数:1->2->3->4->5->6 那么中心节点为第三个节点和第四个节点 因题目要求输出第后面的中心节点 故也为length/2+1

第一种解题方法:设置快慢指针,快指针每次走两步,慢指针每次走一次,那么当快指针走到重点时,慢指针就刚好在中间节点。(推荐)

第二种解题方法:遍历链表,计算其长度,然后再次遍历找到中心节点。

第一种解题方法源代码:

class ListNode {
     int val;
     ListNode next;
     ListNode(int x) {
         val = x;
     }
  }
class Solution {
    public static ListNode reverseList(ListNode head,int val) {
        if(head==null){//空指针
            return null;
        }
        ListNode fast=head;
        ListNode slow=head;
        while(fast.next!=null){//循环条件
            if(fast.next.next!=null){
                fast=fast.next.next;
                slow=slow.next;
            }else{
                fast=fast.next;
                slow=slow.next;
            }
        }
            return slow;
    }
    public static void main(String[] args){
        ListNode listNode1=new ListNode(6);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(6);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(6);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        ListNode prev=reverseList(listNode1,6);
        for(ListNode temp=prev;temp!=null;temp=temp.next){
            System.out.print(temp.val+" ");
        }
    }
}

长度为偶数测试结果:

在这里插入图片描述

长度为奇数测试结果:

public static void main(String[] args){
        ListNode listNode1=new ListNode(6);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(6);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(6);
        ListNode listNode6=new ListNode(7);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        listNode5.next=listNode6;
        ListNode prev=reverseList(listNode1,6);
        for(ListNode temp=prev;temp!=null;temp=temp.next){
            System.out.print(temp.val+" ");
        }
    }

在这里插入图片描述

第二种解题方法:

class ListNode {
     int val;
     ListNode next;
     ListNode(int x) {
         val = x;
     }
  }
class Solution {
    public static ListNode reverseList(ListNode head,int val) {
        int length=0;
        if(head==null){
            return null;
        }
        for(ListNode temp=head;temp!=null;temp=temp.next){//遍历单链表统计长度
            length++;
        }
        ListNode temp=head;
        for(int i=1;i<length/2+1;i++){//寻找中间节点
            temp=temp.next;
        }
        return temp;
    }
    public static void main(String[] args){
        ListNode listNode1=new ListNode(6);
        ListNode listNode2=new ListNode(2);
        ListNode listNode3=new ListNode(6);
        ListNode listNode4=new ListNode(4);
        ListNode listNode5=new ListNode(6);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;
        ListNode prev=reverseList(listNode1,6);
        for(ListNode temp=prev;temp!=null;temp=temp.next){
            System.out.print(temp.val+" ");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42617262/article/details/88213935