leetcode day7
剑指offer
搞几个简单题做做
18 删除链表的节点
题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
思路:双节点
ListNode* deleteNode(ListNode* head, int val) {
ListNode* pre = head; // 当前节点
ListNode* last = head;
if (pre->val == val) {
return head->next;
}
pre = pre->next;
while (pre!=NULL) {
if (pre->val == val) {
last->next = pre->next;
return head;
}
last = pre;
pre = pre->next;
}
return NULL;
}
21 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路:头尾or双头
vector<int> exchange(vector<int>& nums) {
int length=nums.size();
int start=0;
int last=length-1;
while(start<last){
if(nums[start]%2==0){
if(nums[last]%2==1){
int temp=nums[start];
nums[start]=nums[last];
nums[last]=temp;
start++;
last--;
}
else{
last--;
}
}
else{
start++;
}
}
return nums;
}
22 链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
思路:双指针保持距离k移动
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* fore=head;
ListNode* back=head;
for(int i=0;i<k;i++){
if(fore==NULL){
return NULL;
}
fore=fore->next;
}
while(fore!=NULL){
fore=fore->next;
back=back->next;
}
return back;
}
24 反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路:三个指针
ListNode* reverseList(ListNode* head) {
if(head==NULL){
return head;
}
if(head->next==NULL){
return head;
}
ListNode* right=head->next;
ListNode* mid=head->next;
ListNode* left=head;
head->next = NULL;
while(right!=NULL){
right=right->next;
mid->next=left;
left=mid;
mid=right;
}
return left;
}