使用c语言来编写一个非递归程序以O(N)时间翻转单链表
时间: 2024-09-27 11:09:49 浏览: 35
C语言实现N皇后问题非递归求解
在C语言中,非递归地翻转一个单链表可以使用迭代方法,通过三个指针分别指向当前节点、前一个节点和下一个节点,然后依次交换它们的位置。以下是详细的步骤和代码示例:
首先,我们需要定义链表节点结构体:
```c
typedef struct ListNode {
int val; // 节点值
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
```
然后编写翻转链表的函数:
```c
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) { // 如果链表为空或只有一个节点,无需翻转
return head;
}
ListNode* prev = NULL; // 初始化前一个节点为NULL
ListNode* curr = head; // 当前节点初始化为头节点
while (curr != NULL) {
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点的next指向前一个节点
prev = curr; // 更新前一个节点为当前节点
curr = nextTemp; // 移动到下一个节点
}
return prev; // 返回新的头节点
}
```
这个算法的时间复杂度是O(N),因为它遍历了整个链表一次。空间复杂度是O(1),因为只用了几个额外的指针,不随输入规模增长。
阅读全文