第一题 反转链表
题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
分析:
目的是反转链表并返回反转后的链表,可以考虑使用三个指针来解答。
第一个指针记录NULL,第二个指针记录head,第三个指针为第二个指针的next;
这时就要考虑特殊情况空列表,以及结束的条件为第二个指针走到NULL。
画图分析
完整代码如下:
struct ListNode* reverseList(struct ListNode* head){
//利用三个指针来写
struct ListNode* n1,*n2,*n3;
n1=NULL;
n2=head;
//考虑特殊情况 n2为空 也就是没有节点
if(n2)
n3=n2->next;
//当n2走到NULL时结束
while(n2)
{
n2->next=n1;
//把n3给n2 n2给n1 往后走
n1=n2;
n2=n3;
if(n3)
n3=n3->next;
}
return n1;
}
第二题 链表的中间节点
题目链接:https://leetcode.cn/problems/middle-of-the-linked-list/description/
分析:看到此题可以利用经典的快慢指针来解答。定义slow和fast两个指针,slow走一步,发生fast走两步,当fast走到尾部时slow刚好走到中间节点;这时我们也要考虑如果链表中间有脸两个节点呢,这时就需要fast走到NULL才能找到中间节点。
画图分析:
完整代码:
struct ListNode* middleNode(struct ListNode* head){
//利用快慢指针,找到中间节点,slow走一步,fast走两步
struct ListNode* slow,*fast;
slow = head;
fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
第三题 输入一个链表,输出该链表中倒数第k个结点
题目链接:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)
分析:这题跟上面的题很相似,改变fast的行进步数即可,即是当fast先走k步,fast走到尾部时slow走到的位置即是倒数的第K个节点。
画图分析:
完整代码:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
// write code here
struct ListNode* slow= pListHead,*fast= pListHead;
while(k--)//走k步
{
//当链表小于k步时 返回NULL
if(fast==NULL)
return NULL;
fast = fast->next;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
第四题 合并两个有序链表
题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/description/
分析:首先这题要求是合并两个升序链表,可以考虑使用两个链表比较又因为是升序,所以采用取小尾插,如果是降序就是头插。当两个链表比较时,首先考虑链表为NULL,再进行两个链表比较,取小的尾插。
画图分析:
完整代码:
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
//考虑链表为NULL的情况
if(list1 == NULL)
return list2;
if(list2 == NULL)
return list1;
struct ListNode* head=NULL,* tail = NULL;;
//当list1和list2链表都不为空运行
while(list1 && list2)
{
//当list1->val < list2->val
if(list1->val < list2->val)
{
//如果为NULL
if(tail == NULL)
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;
}
else
{
//如果为NULL
if(tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;
}
}
if(list1)
tail->next = list1;
if(list2)
tail->next = list2;
return head;
}
以上就是我对这些题的看法,如有不对不妥之处欢迎大家交流!