/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
if(!head) return(NULL);
else {
struct ListNode *pr, *p;
p = head -> next;
pr = NULL;
while(p) {
head -> next = pr;
pr = head;
head = p;
p = p -> next;
}
head -> next = pr;
return(head);
}
}
总体思路:
使用三个指针,分别指向前、中、后三个结点。用循环依次修改链表中每一个结点的指针域,使其指向前一个结点。然后再移动三个指针,处理下一个结点。
实现要点:
1.三个指针的创建。
2.修改指针域,移动指针。
时间复杂度分析:
对链表遍历一遍,时间复杂度为O(n)。
遇到的问题:
1.当输入空链表时,访问头结点的下一个结点时报错。
2.结束循环时,最后一个结点的指针域实际上还是指向NULL,需要在结尾进行修改,使其指向前一个结点。