C++剑指Offer系列(1)——链表中倒数第K个节点(JZ14)调整数组使奇数位于偶数前面(JZ13)

剑指Offer系列(1)

  • 1. 链表中倒数第K个节点
  • 2. 调整数组使奇数位于偶数前面

1. 链表中倒数第K个节点

题目: 输入一个链表,输出该链表中倒数第k个结点。
原来的想法很简单,统计链表长度n,n-k+1,顺序下移就行了
但是有更简单的快速法。

  • 初始化指针1与指针2指向开头,将指针2向前移动 k − 1 k-1 k1个位置。
  • 将指针1和指针2同时向后移动,直到指针2到达最后一个节点
  • 此时指针1指向倒数第k个节点。
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
     
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
     
        if(k==0||pListHead == NULL)return NULL; //智障错误,pListHead可能为空
        ListNode* tmp = pListHead;
        ListNode* tmp2 = pListHead;
        for(unsigned int i =0 ;i<k-1;i++){
         //设置先走k-1步
          if(tmp2->next != NULL)    //考虑k大于长度,这也是个弱智错误
                tmp2 = tmp2->next;
            else
            {
     
                return NULL;
            }
        }
        while(tmp2->next!=NULL){
         //当先走的到了尾部,后走的到了k的位置
            tmp2 = tmp2->next;
            tmp = tmp->next;
        }
        return tmp;
        
        
    }
};

这道题本来就不难,主要是有两个很弱智的错误,还需要考虑链表为空,或者k大于链表长度的情况,浪费了很长时间DEBUG,着实没想到弄这两个特殊条件对这题有什么意义。

2. 调整数组使奇数位于偶数前面

这道题我想的是弱智算法,另设置一个vector

class Solution {
     
public:
    void reOrderArray(vector<int> &array) {
     
      vector<int> tmp = array;
      int len =0;
      for(int i = 0; i< array.size();i++){
     
        if(array[i]&1 !=0){
     
            tmp[len] = array[i];
            len++;
        }
      }
        for(int i = 0; i< array.size();i++){
     
        if(array[i]%2 ==0){
     
            tmp[len] = array[i];
            len++;
        }
      }
        array  = tmp;
    }
};

另一种方法就是不另设空间,也不是很巧

class Solution {
     
public:
  void reOrderArray(vector<int> &array) {
     
      int i = 0;
      for (int j=0; j<array.size(); ++j) {
     
          if (array[j]&1) {
     
              int tmp = array[j];
              for (int k=j-1; k>=i; --k) {
     
                  array[k+1] = array[k];
              }
              array[i++] = tmp;
          }
      }
  }
};

这一题比较简单

你可能感兴趣的:(刷题,数据结构,算法,链表)