876. 链表的中间结点
程序员文章站
2022-04-24 16:22:19
...
#876. 链表的中间结点
今天摸鱼了一天啥也没干,到了晚上抱着愧疚的心理打开了力扣,准备把每日一题刷了就去睡觉。没想到今天的题好简单啊,实在是太简单了,居然一遍过,感觉就是数据结构里超级基础的内容。
题目描述
解题思路
1、单指针遍历链表
这个根本不需要什么思路嘛,大概就是先遍历一遍找出链表长度,然后返回中间的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public ListNode middleNode(ListNode head) {
ListNode p = head;
int n = 1;
while(p.next != null) {
++n;
p = p.next;
}
p = head;
for (int i = 1; i < n/2 + 1; i++) {
p = p.next;
}
return p;
}
2、快慢指针法
又是上次学到的新知识呢!但是我完全没想到,看评论之后发现的。思路就是一个慢指针,一个快指针,快指针的速度是慢指针的两倍,这样当快指针遍历到末尾的时候,慢指针一定在链表中间。
public ListNode middleNode1(ListNode head) {
ListNode fast,slow;
fast = slow = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
上一篇: 9. 回文数
下一篇: 余凯:智能不等于智慧 别说计算机比人聪明
推荐阅读