链表-反转等操作
作者:
迷弟
,
2024-07-10 16:33:07
,
所有人可见
,
阅读 15
## 模拟一遍
1->2->3->4->5
先声明:
a=1,b=2,c=3分别指向这三个节点
a->b->c->4->5
a<-b c->4->5
1<-a c->4->5
1<-a b->4->5
第一重循环结束
随后第二重循环
1<-a<-b c->5
1<-2<-a c->5
1<-2<-a b->5
随后第三重循环
1<-2<-a<-b c
1<-2<-3<-a c
1<-2<-3<-a b
随后第四重循环
1<-2<-3<-a<-b c(nil空指针)
1<-2<-3<-4 a b(nil)
最后一重循环
1<-2<-3<-4<-a
随后退出。把指向1的head指针删掉,返回a即可。
/**
* 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) return NULL;
ListNode* a = head;
ListNode* b = a->next;
while (b){
ListNode* c = b->next; //b后面的链, 由于要反转会断开,所以存在c临时记录下
b->next = a; //反转 【核心操作就这一步,把b这个指针的next指针断开c而指向前面的a=1这个点】
a = b; //a指针向后移动一位
b = c; //b指针向后移动一位
}
head->next=NULL; //由于head指向1,也就是如今的尾节点,且它的next指针还指着2,在单链表中,尾节点必须有个NEXT指针,这里必须指向NULL表示这个单链表结束。
return a;
}
};
Golang
func reverseList(head *ListNode) *ListNode {
//var a *ListNode
if (head == nil) {return nil}
a := head
b := a.Next
for ; b!=nil;{
c := b.Next
b.Next = a
a = b
b = c
}
head.Next=nil
return a
}