想做好数据结构题目先画图理清一下思路,先想好,再去具体实现。不然写了错,错了改,还会出现写了一百多行最后发现找不到错误,最后含泪重开......wuu我就是这样,不写难受一天,写了更难受了。
leetcode.206.反转链表
https://leetcode-cn.com/problems/reverse-linked-list/
这题可以用双指针解决:
设置两个指针end1,end2.
end1指向前一个,end2指向后一个,两个指针分别表示局部紧邻的链表结点
end1初始就为NULL,end2初始为头部,这样将它们交换,再往后移一步,在end2为最后一个元素,交换完成后链表这时候就反转完毕了。
struct ListNode* reverseList(struct ListNode* head){
struct ListNode* end1=NULL;
struct ListNode* end2=head;
if(head==NULL||head->next==NULL)
return head;
while(end2)
{
struct ListNode* end2_next=end2->next;//存储链表的下一个元素,不然找不到后面的结点
end2->next=end1;
end1=end2;
end2=end2_next;//反转局部的链表
}
return end1;
}
leetcode.876.链表的中间结点
https://leetcode-cn.com/problems/middle-of-the-linked-list/
这一题解法挺多的,我用了最简单的一种
直接上代码
//快慢指针法
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* end1=head;
struct ListNode* end2=head;
while(end2&&end2->next)//确保了end2不会解引用空指针
{
end1=end1->next;//走一步
end2=end2->next->next;//走两步
}
return end1;
}