用C语言编写一个非递归过程,以O(N)时间反转单链表
时间: 2024-09-28 17:11:23 浏览: 74
在C语言中,我们可以使用迭代的方式来非递归地反转一个单链表,这样的时间复杂度确实是O(N),其中N是链表的长度。这里有一个简单的实现步骤:
首先,我们需要定义链表结构体:
```c
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
```
接下来,我们创建一个辅助节点prev,它指向当前节点的前一个节点,初始为空:
```c
ListNode* prev = NULL;
ListNode* curr = head;
```
然后进入一个循环,遍历整个链表:
1. 检查是否还有下一个节点(curr不为NULL);
2. 将当前节点的next指针指向前一个节点(相当于反转了它们的关系);
3. 更新prev和curr,分别指向当前节点和下一个节点继续遍历;
4. 当遍历完后,将原头节点赋值给新的头节点,因为现在的prev就是新的头。
以下是完整的代码实现:
```c
void reverseList(ListNode** head) {
ListNode* prev = NULL;
ListNode* curr = *head;
while (curr != NULL) {
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 反转当前节点的next指针
prev = curr; // 移动prev指针
curr = nextTemp; // 移动curr指针
}
*head = prev; // 新的头节点是原链表的尾部
}
```
阅读全文