链表的中间结点(链表的运用,双指针leetcode876)---------------c语言实现
题目表述
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
样例
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
条件
给定链表的结点数介于 1 和 100 之间。
思路
两个指针,每次第一个走两步,第二个走一步,走到最后输出第二个指针即可。
注意点
主要难点是链表的运用,此题也是对链表的一次复习练习。
自己测试时代码:
#include<bits/stdc++.h>
using namespace std;
struct ListNode {
int val;
ListNode *next;
};
void showList(ListNode* a){
ListNode * x;
x=a;
cout<<"输出链表:";
while(x!=NULL)
{
cout<<x->val<<" ";
x=x->next;
}
}//不过滤头节点,从第一个节点开始输出
//AC函数
struct ListNode* middleNode(struct ListNode* head){
struct ListNode * front,*rear;
front=head;
rear=head;
//在本地编译器的时候是front=head->next,rear=head->next,本地样例能过,但是在leetcode编译器时,按样例只输出4,5,不知道为什么,有大佬能帮忙解答的欢迎留言。
// showList(rear);
// cout<<"获取开始"<<endl;
while(rear!=NULL&&rear->next!=NULL)
{
rear=rear->next->next;
front=front->next;
}
// cout<<"获取结束"<<endl;
// showList(front);
return front;
}
void creat(ListNode* &q,int a[],int size){
ListNode *p,*x;
q=(ListNode*)malloc(sizeof(ListNode));
q->next=NULL;
while(size--)
{
p=(ListNode*)malloc(sizeof(ListNode));
p->next=NULL;
p->val=a[size];
p->next=q->next;
q->next=p;
// cout<<q->next->val<<" "<<endl;
}
cout<<"插入结束"<<endl;
showList(q->next);
}
int main(){
ListNode* a=(ListNode*)malloc(sizeof(ListNode));
ListNode* x;
int nums[5]={1,2,3,4,5};
creat(a,nums,5);
// cout<<"显示函数:"<<endl;
// showList(a->next);
cout<<"进入选择函数"<<endl;
x=middleNode(a);
showList(x);
return 0;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。