反转一个单链表 --java 记录

在这里插入图片描述
第一种利用迭代,利用最初的头节点作为p节点,每次将它的下一个节点作为头节点然后进行位子交换,直到点p.next为空,则交换完毕。

迭代方法leecode含义解释为:

按原始顺序迭代结点,并将它们逐个移动到列表的头部
让我们看一个例子:

请记住,黑色结点 23 是原始的头结点。
在这里插入图片描述

  1. 首先,我们将黑色结点的下一个结点(即结点 6)移动到列表的头部:在这里插入图片描述

  2. 然后,我们将黑色结点的下一个结点(即结点 15)移动到列表的头部:

在这里插入图片描述

  1. 黑色结点的下一个结点现在是空。因此,我们停止这一过程并返回新的头结点 15。
class Solution {
     public ListNode reverseList(ListNode head) {
	        ListNode p = head;
            ListNode prehead ;
            if(head == null){
                return null;
            }
		 	while(p.next != null) {
		 		prehead = head; //记录旧的头节点
		 		head = p.next;  //记录新的头节点
		 		p.next = p.next.next;
		 		head.next = prehead;
		 	}
		 	return head;
	    }
}

递归方法为:

class Solution {
     public ListNode reverseList(ListNode head) {
    if(head == null || head.next==null){
        return head;
    }
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}
}
在C++中,可以使用迭代或递归的方式来编写一个单链表反转的函数。这里提供一个简单的迭代方法: ```cpp #include <iostream> using namespace std; // 定义链表节点结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; // 单链表反转的函数 ListNode* reverseList(ListNode* head) { ListNode* prev = nullptr; // 创建前驱指针 ListNode* curr = head; // 当前指针初始指向头结点 while (curr != nullptr) { // 遍历链表直到遇到空节点 ListNode* temp = curr->next; // 临时保存当前节点的下一个节点 curr->next = prev; // 将当前节点的next指向前一个节点 prev = curr; // 移动前驱指针到当前节点 curr = temp; // 移动当前节点到下一个未处理的节点 } return prev; // 返回新的头结点,即原链表的尾节点 } // 打印链表辅助函数 void printList(ListNode* head) { while (head) { cout << head->val << " -> "; head = head->next; } cout << "nullptr" << endl; } int main() { // 创建一个示例链表 ListNode* list = new ListNode(1); list->next = new ListNode(2); list->next->next = new ListNode(3); list->next->next->next = new ListNode(4); cout << "Original List: "; printList(list); // 反转链表 ListNode* reversedList = reverseList(list); cout << "Reversed List: "; printList(reversedList); return 0; } ``` 在这个例子中,`reverseList` 函数接收一个链表的头节点作为输入,通过改变每个节点的 `next` 指针,实现了链表的反转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值