C语言:实现反转链表

应对面试练习题1:

**题目:**
 知识点:单链表
 难度:一星
 描述:
 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 
0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。

如当输入链表{1,2,3}时,经反转后,对应的输出为{3,2,1}。


示例一:

输入  {1,2,3};
输出  {3,2,1};

实例:反转链表的实现

import streamlit as st

# 定义链表节点
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 定义反转链表函数
def reverseList(head: ListNode) -> ListNode:
    prev = None
    cur = head
    while cur:
        nxt = cur.next
        cur.next = prev
        prev = cur
        cur = nxt
    return prev

# 初始化链表
def initList(nums: list) -> ListNode:
    dummy_head = ListNode(0)
    cur = dummy_head
    for num in nums:
        node = ListNode(num)
        cur.next = node
        cur = cur.next
    return dummy_head.next

# 输出链表节点值
def printList(head: ListNode):
    res = []
    cur = head
    while cur:
        res.append(cur.val)
        cur = cur.next
    st.write(res)

# Streamlit App
def main():
    st.title("使用C语言反转链表")
    nums = st.text_input("请输入链表节点值,用英文逗号隔开:")
    if nums:
        nums = nums.split(",")
        nums = [int(num) for num in nums]
        head = initList(nums)
        st.write("原链表:")
        printList(head)
        new_head = reverseList(head)
        st.write("反转后的链表:")
        printList(new_head)

if __name__ == '__main__':
    main()

返回结果:

默认链表不为空;若为空,可以使用一个if/else条件就可以实现。

原链表:

[
0:1
1:2
2:3
]

反转后的链表:
[
0:3
1:2
2:1
]
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是C语言实现链表的代码: ``` #include <stdio.h> #include <stdlib.h> // 双链表节点结构体 typedef struct ListNode { int val; struct ListNode* next; struct ListNode* prev; } ListNode; // 链表函数 ListNode* reverseList(ListNode* head) { ListNode* prev = NULL; ListNode* curr = head; while (curr != NULL) { ListNode* next = curr->next; curr->next = prev; curr->prev = next; prev = curr; curr = next; } return prev; } // 打印双链表函数 void printList(ListNode* head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } printf("\n"); } int main() { // 创建双链表 ListNode* node1 = (ListNode*)malloc(sizeof(ListNode)); node1->val = 1; ListNode* node2 = (ListNode*)malloc(sizeof(ListNode)); node2->val = 2; ListNode* node3 = (ListNode*)malloc(sizeof(ListNode)); node3->val = 3; ListNode* node4 = (ListNode*)malloc(sizeof(ListNode)); node4->val = 4; node1->next = node2; node2->prev = node1; node2->next = node3; node3->prev = node2; node3->next = node4; node4->prev = node3; node4->next = NULL; // 打印原始双链表 printf("Original List: "); printList(node1); // 链表 ListNode* newHead = reverseList(node1); // 打印后的双链表 printf("Reversed List: "); printList(newHead); return 0; } ``` 代码解析: 1. 定义了一个双链表节点结构体,包括节点值、下一个节点指针和上一个节点指针。 2. 定义了一个链表的函数,参数为头节点指针,返回值为后的头节点指针。 3. 在链表函数中,定义了三个指针变量,分别代表前一个节点、当前节点和下一个节点。初始时,前一个节点为NULL,当前节点为头节点。 4. 使用while循环遍历整个双链表,每次迭代时,先将当前节点的下一个节点保存到next指针中,然后将当前节点的next指针指向前一个节点,将prev指针指向next节点,更新前一个节点为当前节点,当前节点为next节点。 5. 最后返回前一个节点,即为后的头节点。 6. 定义了一个打印双链表的函数,参数为头节点指针,直接遍历整个链表,打印每个节点的值。 7. 在main函数中,创建了一个包含4个节点的双链表,并打印原始链表。 8. 调用链表函数,得到后的链表头节点指针,并打印后的链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值