一个单向链表, 请你找出中间节点要求只能遍历一遍.
时间: 2024-03-13 15:46:59 浏览: 83
要找出单向链表的中间节点,可以使用快慢指针的方法,快指针每次向前移动两个节点,慢指针每次向前移动一个节点,当快指针到达链表尾部时,慢指针所指向的节点就是中间节点。
具体实现如下(假设链表节点的结构体定义为ListNode):
```c++
ListNode* findMiddleNode(ListNode* head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast && fast->next) {
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
```
时间复杂度为O(n),只需要遍历一遍链表即可找到中间节点。
相关问题
c++遍历单向链表并返回链表某一节点
以下是遍历单向链表并返回链表某一节点的示例代码:
```c++
struct Node {
int data;
Node* next;
};
Node* findNode(Node* head, int val) {
Node* curr = head;
while (curr != nullptr) {
if (curr->data == val) {
return curr;
}
curr = curr->next;
}
return nullptr;
}
```
在上述示例代码中,我们首先定义了一个 `Node` 结构体,其中包含了一个整型变量 `data` 和一个指向下一个节点的指针 `next`。
接下来,我们定义了一个名为 `findNode` 的函数,该函数接收两个参数:一个指向链表头节点的指针 `head` 和一个需要查找的值 `val`。在函数中,我们使用一个 `curr` 指针来遍历整个链表,如果当前节点的值等于需要查找的值,那么就返回该节点的指针;否则,继续遍历下一个节点。如果整个链表都遍历完了还没有找到需要查找的值,那么就返回 `nullptr` 表示未找到。
使用示例:
```c++
int main() {
Node* head = new Node{1, nullptr};
head->next = new Node{2, nullptr};
head->next->next = new Node{3, nullptr};
Node* node = findNode(head, 2);
if (node != nullptr) {
std::cout << "Found node with value " << node->data << std::endl;
} else {
std::cout << "Node not found" << std::endl;
}
return 0;
}
```
在上述示例中,我们首先创建了一个包含三个节点的链表,然后调用 `findNode` 函数查找值为 2 的节点。如果找到了,则输出该节点的值;否则,输出“Node not found”。
单向链表的有关操作,利用C++编写一个完整的代码1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。 2.遍历单向链表。 3.把单向链表中元素逆置(不允许申请新的结点空间)。 4.在单向链表中删除所有的偶数元素结点。
在C++中,我们可以使用`std::list`类来模拟单向链表,因为它提供了一种方便的方式来处理动态添加和删除元素。下面是一个完整的代码示例:
```cpp
#include <iostream>
#include <list>
using namespace std;
class ListNode {
public:
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 生成随机元素
ListNode* generateRandomList(int n) {
srand(time(0));
list<int> random_list(n);
for (int i = 0; i < n; ++i) {
random_list.push_back(rand() % 100); // 生成0到99之间的随机数
}
return buildListFromRandom(random_list.begin(), random_list.end());
}
// 从迭代器构建链表
ListNode* buildListFromIterator(iterators_type it1, iterators_type it2) {
ListNode* head = nullptr;
ListNode* tail = nullptr;
while (it1 != it2) {
head = tail = new ListNode(*it1++);
tail->next = head;
}
return head;
}
// 遍历链表
void traverseList(ListNode* head) {
ListNode* temp = head;
while (temp != nullptr) {
cout << temp->val << " ";
temp = temp->next;
}
cout << endl;
}
// 逆置链表(不申请新空间)
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
ListNode* next = nullptr;
while (curr != nullptr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
// 删除链表中的偶数节点
ListNode* deleteEvenNodes(ListNode* head) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy;
ListNode* curr = head;
while (curr != nullptr) {
if (curr->val % 2 != 0) {
prev->next = curr->next;
} else {
delete curr;
}
prev = curr;
curr = prev->next;
}
dummy->next = nullptr;
return dummy->next;
}
int main() {
int n;
cout << "Enter the number of elements: ";
cin >> n;
ListNode* list = generateRandomList(n);
cout << "Original List: ";
traverseList(list);
list = reverseList(list);
cout << "Reversed List: ";
traverseList(list);
list = deleteEvenNodes(list);
cout << "List after deleting even numbers: ";
traverseList(list);
return 0;
}
```
在这个例子中,我们首先通过`generateRandomList`函数生成一个随机的链表,接着遍历链表,逆置链表,并删除偶数节点。每一步操作后都会打印出新的链表状态。
阅读全文