给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
思路1:翻转
1.用下面的图来讲(形象点,真实情况的话,箭头是不存在的),就是将每个箭头翻转,五个箭头一一反指即可,首先我们应当定义一个*n1为空指针,用来链接链表的最后最后一个元素的next,然后定义*n2作为链表的头部,此时可以这么想,将n2->next=n1,就是将图中元素1的next部分指向了空,然后需要将这个过程循环下去,这就完成了最基本的逻辑。
2.但是在操作的时候,我们将n2->next=n1完成第一步,我们发现找不到元素2了,因为此时元素1的next已经被修改指向NULL,所以我们还需要定义一个指针*n3来提前保存好下一步的地址,也就是n3=head->next,这样第一步执行之后,第二步开始循环之前,将n2的值赋给n1,将n3的值赋给n2,n3=n3->next,这就可以完成循环。
3.此时如果去执行的话,需要判断退出循环的逻辑条件,当n1指向4,n2指向5的时候,4和5的链接还没有执行,执行后,两者链接,n2置空,跳出循环,而此时也需要考虑n3的问题,如果n3变成了空指针,那么就不能执行n3=n3->next这句话,这是典型的对空指针解引用的错误。
思路2:头插
1.首先我们可以定义一个新的空链表newhead置为NULL;然后需要定义*cur为头指向1,也就是head,这是题目中预先给好的。
2.头插的意思是将1这个元素链接到最开始的newhead,也就是NULL,然后将1作为新的newhead,来链接2,这时执行代码就是cur->next=newhead,如此循环完成翻转链表
3.这里和上面那个题一样,当你把1连接到NULL的时候,再回来找2,是找不到的,所以还需要定义一个指针nexter来维护2的地址,也就是next=cur->next,然后还需要将cur=nexter,此时的2就变成了cur,然后继续循环,退出的条件其实就是cur为空,这里还需要想一想,是否有可能在删除最后一个的时候,出现像上面n3的情况,这里其实是不会的。
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
思路:
这个题目使用快慢指针非常好做
定义两个指针同时指向head,一个叫slow一个叫fast,slow一次读一个,fast一次读两个,直到fast读到空(偶数个元素)或者fast->next读到空(奇数个元素)停止循环,此时slow正好就是中间元素。
这些都是单链表的leetcode题目,还会持续更新的