给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
时间: 2024-05-03 19:22:58 浏览: 93
算法思路:
- 定义三个指针pre、cur、next,初始化pre为None,cur为pHead,next为pHead.next;
- 当cur不为空时,执行以下操作:
- 将cur的next指向pre;
- 将pre、cur、next向后移动一个节点;
- 反转完成后,返回pre作为新链表的头节点。
Python代码实现:
```python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def reverseList(self, pHead):
if not pHead or not pHead.next:
return pHead
pre = None
cur = pHead
while cur:
next = cur.next
cur.next = pre
pre = cur
cur = next
return pre
```
时间复杂度:O(n),因为需要遍历整个链表。
空间复杂度:O(1),只需要常数空间存储三个指针。
相关问题
java 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围: 0n\leq10000≤n≤1000
这是一个关于链表反转的算法问题,可以使用三个指针分别指向当前节点、前一个节点和后一个节点,依次遍历链表并反转指针方向即可。具体实现可以参考以下Java代码:
```
public ListNode reverseList(ListNode pHead) {
if (pHead == null || pHead.next == null) {
return pHead;
}
ListNode prev = null;
ListNode curr = pHead;
ListNode next = null;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
希望这个回答能够帮到您!如果您还有其他问题,欢迎继续提问。
用c语言给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。 数据范围: 要求:空间复杂度 ,时间复杂度 。
以下是用C语言实现反转单链表的代码:
```c
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL;
struct ListNode *curr = head;
while(curr != NULL) {
struct ListNode *next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
在该代码中,我们定义了一个结构体 `ListNode` 来表示单链表的每个节点,每个节点有一个整型值 `val` 和一个指向下一个节点的指针 `next`。函数 `reverseList` 用来反转整个链表,它输入链表的头节点 `head`,输出反转后的链表头节点。该函数的实现过程如下:
定义两个指针 `prev` 和 `curr`,分别指向反转后的链表头节点和当前节点。
遍历原链表,每次将当前节点 `curr` 的指针指向前一个节点 `prev`,然后将两个指针都向后移动一位。这样,反转后的链表就被构建出来了。
最后返回 `prev`,即反转后的链表头节点。
时间复杂度为 O(n),空间复杂度为 O(1)。
阅读全文