题目:
例子:
分析题目:
分析题目,因为是一个单链表所以不能找到尾后往前改变,所以不妨换个思路从前往后进行修改链表链接关系
用到三个指针
指针cur指向所要改变的节点链接关系、指针prev指向所要改变节点的前一个节点、指针tail记录所要改变节点的后一个节点
先把cur的链接关系指向prev后把cur往后走继续改变后面的(因为要先改变链接关系,所以有可能找不到后面使用用tail记录下,而prev道理也一样因为不能往回找所以用指针记录一下
有了思路就能写代码了,其中的prev可以先置为NULL
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL || head->next == NULL)//对只有一个元素时的情况单独处理return head;struct ListNode* cur = head , *tail = head->next , *prev = NULL;while(cur){//思路把数据的链表链接反过来,三指针cur->next = prev;//把cur指向prev(prev是前一个位置的空间、当没有前面位置时为NULL也反向代表最后一个位置)prev = cur;//把prev指向改变成已经改变链接的节点cur = tail;//把cur指向记录好的后面位置if(tail)tail = tail->next;}return prev;
}
官方写法:
struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev = NULL;struct ListNode* curr = head;while (curr) {struct ListNode* next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;
}
通过比较可总结:
- 我们在有相关的多个变量时,可以把相关变量写在循环内,这样就能间接省去改变的过程