查找单链表中间节点
问题描述:
输入: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+" ");
}
}
}