给定头节点,编写一个可以输出反转链表的编程代码
时间: 2024-04-29 10:24:39 浏览: 10
可以使用迭代或递归的方式实现反转链表。以下是用迭代方式实现的代码:
```python
def reverse_list(head):
prev, curr = None, head
while curr:
next_node = curr.next
curr.next = prev
prev = curr
curr = next_node
return prev
```
这个函数接受链表的头节点作为参数,返回反转后的链表的头节点。它的实现方式是从头到尾遍历链表,每次将当前节点的 next 属性指向前一个节点,然后移动指针。最后返回反转后的链表的头节点。
如果你想要递归实现,可以使用类似下面这样的代码:
```python
def reverse_list(head):
if not head or not head.next:
return head
new_head = reverse_list(head.next)
head.next.next = head
head.next = None
return new_head
```
这个函数也接受链表的头节点作为参数,返回反转后的链表的头节点。它的实现方式是先递归反转剩余的部分,然后将当前节点的 next 属性指向前一个节点,并将前一个节点的 next 属性设为 None。最后返回反转后的链表的头节点。
相关问题
输入一个链表输出该链表中倒数第k个节点
要输出一个链表中倒数第k个节点,可以使用双指针的方法来实现。
首先,定义两个指针p1和p2,都指向链表的头节点。
让p2向后移动k-1个位置,使得p1和p2之间相隔k-1个节点。
同时移动p1和p2,直到p2指向链表的尾节点。此时p1指向的节点就是倒数第k个节点。
具体的实现步骤如下:
1. 首先判断给定的链表是否为空链表,如果为空则无法输出倒数第k个节点,直接返回null。
2. 定义两个指针p1和p2,都指向链表的头节点。
3. 让p2向后移动k-1个位置,如果移动过程中出现p2为空的情况,则说明链表的节点数少于k个,无法输出倒数第k个节点,直接返回null。
4. 同时移动p1和p2,直到p2指向链表的尾节点。
5. 返回p1指向的节点,即为倒数第k个节点。
整个过程的时间复杂度为O(n),其中n为链表的长度。
以下是具体的实现代码示例:
```python
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def findKthFromEnd(head: ListNode, k: int) -> ListNode:
if not head:
return None
p1 = head
p2 = head
for _ in range(k-1):
p2 = p2.next
if not p2:
return None
while p2.next:
p1 = p1.next
p2 = p2.next
return p1
```
这样通过调用findKthFromEnd函数,传入链表的头节点和k的值,即可找到链表中倒数第k个节点的值。
给定一个单链表l,请编写程序输出l中间节点保存的数据
首先,需要遍历整个单链表,统计出单链表的长度。然后找到单链表的中间节点位置,如果单链表长度为偶数,则中间节点有两个,输出其中较大的一个即可。
找到中间节点位置的方法有多种,可以使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表末尾时,慢指针指向的就是中间节点。
另外,如果单链表长度较小,可以直接使用数组将所有节点存储下来,然后输出中间节点即可。
具体代码实现如下:
```
# 定义单链表节点类
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def find_mid_node(head: ListNode) -> int:
# 先遍历整个单链表,统计长度
length = 0
curr = head
while curr:
length += 1
curr = curr.next
mid = length // 2 # 计算中间节点位置
# 使用快慢指针找中间节点
slow, fast = head, head
for i in range(mid):
fast = fast.next
while fast.next:
slow = slow.next
fast = fast.next
if length % 2 == 0:
return max(slow.val, slow.next.val)
else:
return slow.val
```
此外,还需要注意单链表为空或只有一个节点的情况,这时中间节点就是链表的唯一节点。