题目内容
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
通过次数428,572
提交次数600,459
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
c语言解答(迭代法)
/**
* 反转链表 迭代法
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
//当链表为空时候
if(head==NULL){
return NULL;
}
//用来遍历指针的链表
struct ListNode *p=head;
//构建的新链表
struct ListNode *q=head;
//中间指针用来接收
struct ListNode *t=head;
//开始遍历,先用p记录下来头结点的下一个节点
p=head->next;
// 只要遍历链表的指针p不为空就一直遍历链表
while(p!=NULL){
//中间指针保存当前遍历链表的下一个
t=p->next;
//把当前遍历指针p位置next指向前面的变量q
p->next=q;
//然后构建的新链表头部就是p,然后给q赋值p
q=p;
//变量p开始走到原链表的下一个
p=t;
}
//新链表的尾结点(地址为head)指向NULL
head->next=NULL;
return q;
}
c语言解答( 力扣官方答案:递归)
/*
* 代码是官方答案,,但是非常好理解
其实递归就是把问题分解成一个一个子问题
递归去解决第一个节点指向的后面结点即head->next
你解决的是反转第一个结点和后面链表 通过不断递归,头结点不断变成当前结点后面的结点,然后最后就成为解决一个小的子问题.
*/
struct ListNode* reverseList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return newHead;
}
java解答(迭代法)
/**
* 迭代法 方法同c语言
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//当链表为空时候
if(head==null){
return null;
}
//用来遍历指针的链表
ListNode p=head;
//构建的新链表
ListNode q=head;
//中间指针用来接收
ListNode t=head;
//开始遍历,先用p记录下来头结点的下一个节点
p=p.next;
// 只要遍历链表的指针p不为空就一直遍历链表
while(p!=null){
//中间指针保存当前遍历链表的下一个
t=p.next;
//把当前遍历指针p位置next指向前面的变量q
p.next=q;
//然后构建的新链表头部就是p,然后给q赋值p
q=p;
//变量p开始走到原链表的下一个
p=t;
}
//新链表的尾结点(地址为head)指向NULL
head.next=null;
return q;
}
}
本文介绍了一种常见的数据结构操作——单链表的反转,并提供了C语言及Java语言下的迭代法和递归法实现。通过详细代码示例,帮助读者理解和掌握如何实现单链表的反转。
2177

被折叠的 条评论
为什么被折叠?



