当前位置:网站首页>使用快慢指针实现链表找中点问题
使用快慢指针实现链表找中点问题
2022-06-10 07:35:00 【明朗晨光】
要求
1)输入链表头节点,奇数长度返回中点,偶数长度返回上中点
2)输入链表头节点,奇数长度返回中点,偶数长度返回下中点
3)输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个
4)输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个
注:比如1->2->3->4链表,上中点为2,下中点为3。
C++ 版本
/************************************************************************* > File Name: 021.快慢指针.cpp > Author: Maureen > Mail: [email protected] > Created Time: 四 6/ 9 16:32:14 2022 ************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
class Node {
public:
int value;
Node *next;
Node(int v) : value(v), next(nullptr) {
}
};
//1. 给定链表头节点,奇数长度返回中点,偶数长度返回上中点
Node *midOrUpMidNode(Node *head) {
if (head == nullptr) return head;
Node *slow = head;
Node *fast = head->next;
while (fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//2. 给定链表头结点,奇数长度返回中点,偶数长度返回下中点
Node *midOrDownMidNode(Node *head) {
if (head == nullptr) return head;
Node *slow = head;
Node *fast = head;
while (fast != nullptr && fast->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//3. 给定链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个
Node *midOrUpMidPreNode(Node *head) {
if (head == nullptr || head->next == nullptr) return nullptr;
Node *slow = head;
Node *fast = head->next->next;
while (fast != nullptr && fast->next != nullptr && fast->next->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//4. 给定链表头结点,奇数长度返回中点前一个,偶数长度返回下中点前一个
Node *midOrDownMidPreNode(Node *head) {
if (head == nullptr || head->next == nullptr) return nullptr;
Node *slow = head;
Node *fast = head->next;
while (fast != nullptr && fast->next != nullptr && fast->next->next != nullptr) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
//For test
Node *right1(Node *head) {
if (head == nullptr) return nullptr;
Node *cur = head;
vector<Node *> arr;
while (cur != nullptr) {
arr.push_back(cur);
cur = cur->next;
}
return arr[(arr.size() - 1) / 2];
}
Node *right2(Node *head) {
if (head == nullptr) return nullptr;
Node *cur = head;
vector<Node *> arr;
while (cur != nullptr) {
arr.push_back(cur);
cur = cur->next;
}
return arr[arr.size() / 2];
}
Node *right3(Node *head) {
if (head == nullptr) return nullptr;
Node *cur = head;
vector<Node*> arr;
while (cur != nullptr) {
arr.push_back(cur);
cur = cur->next;
}
return arr[(arr.size() - 3) / 2];
}
Node *right4(Node *head) {
if (head == nullptr) return nullptr;
Node *cur = head;
vector<Node *> arr;
while (cur != nullptr) {
arr.push_back(cur);
cur = cur->next;
}
return arr[(arr.size() - 2) / 2];
}
int main() {
Node *test = nullptr;
test = new Node(0);
test->next = new Node(1);
test->next->next = new Node(2);
test->next->next->next = new Node(3);
test->next->next->next->next = new Node(4);
test->next->next->next->next->next = new Node(5);
test->next->next->next->next->next->next = new Node(6);
test->next->next->next->next->next->next->next = new Node(7);
test->next->next->next->next->next->next->next->next = new Node(8);
test->next->next->next->next->next->next->next->next->next = new Node(9);
Node *ans1 = nullptr;
Node *ans2 = nullptr;
ans1 = midOrUpMidNode(test);
ans2 = right1(test);
cout << "=======midOrUpMidNode vs. right1==========" << endl;
cout << (ans1 != nullptr ? ans1->value : -1) << endl;
cout << (ans2 != nullptr ? ans2->value : -1) << endl;
ans1 = midOrDownMidNode(test);
ans2 = right2(test);
cout << "=======midOrDownMidNode vs. right2==========" << endl;
cout << (ans1 != nullptr ? ans1->value : -1) << endl;
cout << (ans2 != nullptr ? ans2->value : -1) << endl;
ans1 = midOrUpMidPreNode(test);
ans2 = right3(test);
cout << "=======midOrUpMidPreNode vs. right3==========" << endl;
cout << (ans1 != nullptr ? ans1->value : -1) << endl;
cout << (ans2 != nullptr ? ans2->value : -1) << endl;
ans1 = midOrDownMidPreNode(test);
ans2 = right4(test);
cout << "=======midOrDownMidPreNode vs. right4==========" << endl;
cout << (ans1 != nullptr ? ans1->value : -1) << endl;
cout << (ans2 != nullptr ? ans2->value : -1) << endl;
return 0;
}
Java 版本
public class LinkedListMid {
public static class Node {
public int value;
public Node next;
public Node(int v) {
value = v;
}
}
// head 头
public static Node midOrUpMidNode(Node head) {
if (head == null || head.next == null || head.next.next == null) {
return head;
}
// 链表有3个点或以上
Node slow = head.next;
Node fast = head.next.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static Node midOrDownMidNode(Node head) {
if (head == null || head.next == null) {
return head;
}
Node slow = head.next;
Node fast = head.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static Node midOrUpMidPreNode(Node head) {
if (head == null || head.next == null || head.next.next == null) {
return null;
}
Node slow = head;
Node fast = head.next.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static Node midOrDownMidPreNode(Node head) {
if (head == null || head.next == null) {
return null;
}
if (head.next.next == null) {
return head;
}
Node slow = head;
Node fast = head.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public static Node right1(Node head) {
if (head == null) {
return null;
}
Node cur = head;
ArrayList<Node> arr = new ArrayList<>();
while (cur != null) {
arr.add(cur);
cur = cur.next;
}
return arr.get((arr.size() - 1) / 2);
}
public static Node right2(Node head) {
if (head == null) {
return null;
}
Node cur = head;
ArrayList<Node> arr = new ArrayList<>();
while (cur != null) {
arr.add(cur);
cur = cur.next;
}
return arr.get(arr.size() / 2);
}
public static Node right3(Node head) {
if (head == null || head.next == null || head.next.next == null) {
return null;
}
Node cur = head;
ArrayList<Node> arr = new ArrayList<>();
while (cur != null) {
arr.add(cur);
cur = cur.next;
}
return arr.get((arr.size() - 3) / 2);
}
public static Node right4(Node head) {
if (head == null || head.next == null) {
return null;
}
Node cur = head;
ArrayList<Node> arr = new ArrayList<>();
while (cur != null) {
arr.add(cur);
cur = cur.next;
}
return arr.get((arr.size() - 2) / 2);
}
public static void main(String[] args) {
Node test = null;
test = new Node(0);
test.next = new Node(1);
test.next.next = new Node(2);
test.next.next.next = new Node(3);
test.next.next.next.next = new Node(4);
test.next.next.next.next.next = new Node(5);
test.next.next.next.next.next.next = new Node(6);
test.next.next.next.next.next.next.next = new Node(7);
test.next.next.next.next.next.next.next.next = new Node(8);
Node ans1 = null;
Node ans2 = null;
ans1 = midOrUpMidNode(test);
ans2 = right1(test);
System.out.println(ans1 != null ? ans1.value : "无");
System.out.println(ans2 != null ? ans2.value : "无");
ans1 = midOrDownMidNode(test);
ans2 = right2(test);
System.out.println(ans1 != null ? ans1.value : "无");
System.out.println(ans2 != null ? ans2.value : "无");
ans1 = midOrUpMidPreNode(test);
ans2 = right3(test);
System.out.println(ans1 != null ? ans1.value : "无");
System.out.println(ans2 != null ? ans2.value : "无");
ans1 = midOrDownMidPreNode(test);
ans2 = right4(test);
System.out.println(ans1 != null ? ans1.value : "无");
System.out.println(ans2 != null ? ans2.value : "无");
}
}
边栏推荐
- 小程序:通过getCurrentPages获取当前页面路由信息
- 小程序:滚动到页面顶部或者某个元素位置
- Summary of CUDA parallel computing optimization strategies
- What is envoy
- R 17 date format exercise
- SQL makes a column empty
- 使用Jenkins的pipeline实现CI/CD
- Esayexcel quick start
- How can smart cities accelerate their development with the help of cloud computing?
- Using Jenkins' pipeline to implement ci/cd
猜你喜欢

How to install and use NPM

电容隔离原理

创建RT-thread软件仿真工程 写RT-thread内核

「动态规划」0/1背包问题

PyQt5基础学习

How to modify photos of downloaded word resume templates

YOLO-SLAM: A semantic SLAM system towards dynamic environment with geometric constraint

YOLO-SLAM: A semantic SLAM system towards dynamic environment with geometric constraint

2. zk的工作机制

Cython的使用
随机推荐
MySql 查看数据库信息常用命令
[dynamic planning] leetcode1092 Shortest common supersequence
Ifndef action
leetcode.38 ---外观数列
2022-06-09:每个会议给定开始和结束时间, 后面的会议如果跟前面的会议有任何冲突,完全取消冲突的、之前的会议,安排当前的。 给定一个会议数组,返回安排的会议列表。 来自通维数码。
Zhangxiaobai teaches you how to use Ogg to synchronize Oracle 19C data with MySQL 5.7 (4)
Solving the problem of interval updating + interval maximum value by block sequence
2. zk的工作机制
Ros2+gazebo11+car+opencv line patrol recognition and speed steering control learning
Rk3399 default browser and Chinese language
qt制作简易的视频通话
29. solution for 300ms delay time of click event at mobile terminal
How to modify photos of downloaded word resume templates
Nationwide provincial and municipal linkage JSON data
QT makes simple video calls
markdown md 文件编辑器测试使用说明
Solution: the go language item in vscode cannot be automatically imported
创建RT-thread软件仿真工程 写RT-thread内核
21 r laptop, sappry application
04MySQL索引原理分析-1