206. 反转链表 迭代法

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

通过次数283,901提交次数406,363

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {//采用头插法解决反转
       ListNode* dhead=new ListNode();
       ListNode* sc=head;
       while(sc){
           ListNode* tmp=new ListNode(sc->val);
           tmp->next= dhead->next;
         dhead->next=tmp;
           sc=sc->next;
       }

        return dhead->next;//因为是带有头节点的 所以要返回dhead->next
    }
};

迭代法 法二 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {//不断迭代
       if(!head||head->next==NULL){
           return head;
       } 
       ListNode* oldNode=head;
       ListNode* newNode=NULL;
       while(oldNode){
           ListNode* tmp=oldNode->next;
           oldNode->next= newNode;
           newNode=oldNode;
          oldNode=tmp;

       }
       return newNode;
    }
};

 

当你需要输入一个单链表并将其反转后输出,可以按照以下步骤操作: 1. **输入单链表**: - 首先,你需要创建一个结构体或类表示链表节点,包含一个数据元素和一个指向下一个节点的指针(例如 `struct Node {int data; struct Node* next;}` 或者 `class ListNode`)。 - 然后,你可以通过用户输入、读取文件或者预先给定的数据构造一个链表。如果通过用户输入,可能会提示用户依次输入每个节点的数据,然后链接它们形成一个序列。 2. **创建链表**: - 初始化一个头结点 (`ListNode head = {0, NULL};`)。 - 对于每一个输入的数据,创建一个新的节点并将它添加到链表的末尾,即 `newNode.next = head.next; head.next = newNode;` 3. **反转链表**: - 使用迭代法或递归法实现链表的反转。这里是一个简单的迭代方法: ```c++ struct Node* reverseList(struct Node* head) { struct Node* prev = nullptr; struct Node* current = head; struct Node* nextTemp; while (current != nullptr) { nextTemp = current->next; current->next = prev; prev = current; current = nextTemp; } return prev; } ``` 4. **输出反转后的链表**: - 将反转后的头结点赋值给原头结点,因为现在`prev`就是新的头结点 (`head = reverseList(head);`) - 最后,遍历反转后的链表,逐个打印节点的数据。从头结点开始直到`NULL`,如 `while (head != NULL) { printf("%d ", head->data); head = head->next; }`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值