题目:
例子:
分析题目:
分析题目,因为是一个单链表所以不能找到尾后往前改变,所以不妨换个思路从前往后进行修改链表链接关系
用到三个指针
指针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;
}
通过比较可总结:
- 我们在有相关的多个变量时,可以把相关变量写在循环内,这样就能间接省去改变的过程