链表的题里面,快慢指针、双指针用得很多。

2.1 Write code to remove duplicates from an unsorted linked list.
FOLLOW UP
How would you solve this problem if a temporary buffer is not allowed?

2.2 Implement an algorithm to find the kth to last element of a singly linked list.

2.3 Implement an algorithm to delete a node in the middle of a singly linked list, given only access to that node.

2.4 Write code to partition a linked list around a value x, such that all nodes less than x come before alt nodes greater than or equal to x.

Leetcode上有,点

2.5 You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1 's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.

Leetcode上有,点
FOLLOW UP
Suppose the digits are stored in forward order. Repeat the above problem.

reverse之后求后然后再reverse结果,careercup上的做法更inefficient。

2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of the loop.

Leetcode上有,点

2.7 Implement a function to check if a linked list is a palindrome,

naive的方法就是把list reverse一下,然后和原串比较。

更好的方法是用stack,比较前半部分还是很巧妙的。stack用来reverse也是比较直观的。注意奇偶长度的list。

递归的方法理解起来更难些。传递指针的指针,使得递归调用后,指针move到对应的镜像位置上了。这一点和Leetcode上Convert Sorted List to Binary Search Tree类似。

 struct ListNode {
int val;
ListNode* next;
ListNode(int v) : val(v), next(NULL) {}
}; class XList {
public:
XList(int n) {
srand(time(NULL));
head = NULL;
for (int i = ; i < n; ++i) {
ListNode* next = new ListNode(rand() % );
next->next = head;
head = next;
}
len = n;
} XList(XList &copy) {
//cout << "copy construct" << endl;
len = copy.size();
if (len == ) return;
head = new ListNode(copy.head->val);
ListNode *p = copy.head->next, * tail = head; while (p != NULL) {
tail->next = new ListNode(p->val);
tail = tail->next;
p = p->next;
}
} ~XList() {
ListNode *tmp = NULL; while (head != NULL) {
tmp = head->next;
delete head;
head = tmp;
}
} // 2.1(1)
void removeDups() {
if (head == NULL) return;
map<int, bool> existed;
ListNode* p = head, *pre = NULL;
while (p != NULL) {
if (existed[p->val]) {
pre->next = p->next;
len--;
delete p;
p = pre->next;
} else {
pre = p;
existed[p->val] = true;
p = p->next;
}
}
} //2.1(2)
void removeDups2() {
ListNode *p = head; while (p != NULL) {
ListNode *next = p;
while (next->next) {
if (next->next->val == p->val) {
ListNode *tmp = next->next;
len--;
delete next->next;
next->next = tmp->next;
} else {
next = next->next; // only move to next in the 'else' block
}
}
p = p->next;
}
} // 2.2(1)
ListNode* findKthToLast(int k) {
if (head == NULL) return NULL;
if (k <= ) return NULL; // more efficient
ListNode *fast = head, *slow = head;
int i = ;
for (; i < k && fast; ++i) {
fast = fast->next;
}
if (i < k) return NULL;
while (fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
} //2.2(2)
ListNode* findKthToLast2(int k) {
return recursiveFindKthToLast(head, k);
} //2.2(2)
ListNode* recursiveFindKthToLast(ListNode *h, int &k) {
if (h == NULL) {
return NULL;
} // should go to the end
ListNode *ret = recursiveFindKthToLast(h->next, k);
k--;
if (k == ) return h;
return ret;
} // 2.3
bool deleteNode(ListNode* node) {
if (node == NULL || node->next == NULL) return false; // in the middle, head is also ok, because we don't delete node itself ListNode *next = node->next;
node->val = next->val;
node->next = next->next;
len--;
delete next;
return true;
} // 2.4
void partition(int x) {
if (head == NULL) return;
ListNode less(), greater();
ListNode* p = head, *p1 = &less, *p2 = &greater; while (p) {
if (p->val < x) {
p1->next = p;
p1 = p1->next;
} else {
p2->next = p;
p2 = p2->next;
}
p = p->next;
} p1->next = greater.next;
head = less.next;
} // 2.7(1)
bool isPalindrome() {
if (head == NULL) return true;
stack<ListNode*> st;
ListNode *fast = head, *slow = head;
while (fast && fast->next) {
st.push(slow);
slow = slow->next;
fast = fast->next->next;
} if (fast) slow = slow->next; // fast->next = null, odd number, skip the middle one while (slow) {
if (slow->val != st.top()->val) return false;
slow = slow->next;
st.pop();
} return true;
} // 2.7(2)
bool isPalindrome2() {
ListNode* h = head;
return recursiveIsPalindrome(h, len);
} bool recursiveIsPalindrome(ListNode* &h, int l) { // note that h is passed by reference
if (l <= ) return true;
if (l == ) {
h = h->next; // move, when odd
return true;
}
if (h == NULL) return true;
int v1 = h->val;
h = h->next;
if (!recursiveIsPalindrome(h, l - )) return false;
int v2 = h->val;
h = h->next;
cout << v1 << " vs. " << v2 << endl;
return v1 == v2;
} void print() const {
ListNode *p = head;
while (p != NULL) {
cout << p->val << "->";
p = p->next;
}
cout << "NULL(len: " << len << ")" << endl;
} int size() const {
return len;
} void insert(int v) {
len++;
ListNode *node = new ListNode(v);
node->next = head;
head = node;
}
private:
ListNode *head;
int len;
};

Careercup | Chapter 2的更多相关文章

  1. Careercup | Chapter 1

    1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...

  2. Careercup | Chapter 3

    3.1 Describe how you could use a single array to implement three stacks. Flexible Divisions的方案,当某个栈满 ...

  3. Careercup | Chapter 8

    8.2 Imagine you have a call center with three levels of employees: respondent, manager, and director ...

  4. Careercup | Chapter 7

    7.4 Write methods to implement the multiply, subtract, and divide operations for integers. Use only ...

  5. CareerCup Chapter 9 Sorting and Searching

    9.1 You are given two sorted arrays, A and B, and A has a large enough buffer at the end to hold B. ...

  6. CareerCup chapter 1 Arrays and Strings

    1.Implement an algorithm to determine if a string has all unique characters What if you can not use ...

  7. CareerCup Chapter 4 Trees and Graphs

    struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...

  8. Careercup | Chapter 6

    6.2 There is an 8x8 chess board in which two diagonally opposite corners have been cut off. You are ...

  9. Careercup | Chapter 5

    5.1 You are given two 32-bit numbers, N andM, and two bit positions, i and j. Write a method to inse ...

随机推荐

  1. PHP数组函数 array_multisort() ----对多个数组或多维数组进行排序

    PHP中array_multisort可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序. 关联(string)键名保持不变,但数字键名会被重新索引. 输入数组被当成一个表的列并以 ...

  2. bash数组操作-定义/初始化/赋值…

    数组:     连续的多个独立内存空间,每个内存空间相当于一个变量     数组元素:数组名+索引         索引:从0开始编号             声明数组:         declar ...

  3. STM8 EEPROM心得

    对于STM8来说,其内部的EEPROM确实是个不错的东西,而且STM8S103/105价格已经非常便宜了,当然也可以用STM8S003/005代替,而且价格更便宜,大概在,1.2/2.0元左右,比10 ...

  4. php三种方式操作mysql数据库

    php可以通过三种方式操作数据库,分别用mysql扩展库,mysqli扩展库,和mysqli的预处理模式分别举案例加以说明 1.通过mysql方式操作数据库 工具类核心代码: <?php cla ...

  5. 评估后Vista时代系统内核模式安全性

    Windows Vista与之前的MS Windows版本(包括WindowsXPSP2)相比增加了很多的安全性.Vista新安全性的特征可以包括以下几个方面: 驱动签名 路径保护 内核模式代码完整性 ...

  6. luogu2698 [USACO12MAR]花盆Flowerpot

    单调队列+二分答案 #include <algorithm> #include <iostream> #include <cstring> #include < ...

  7. 关于windows服务的编写/安装/与调试

    前注: 首先,这篇文章是从网上转过来的,因为最近有个项目,需要编写一个Windows Service来定时执行程序,网上很容易找到了这篇文章,大概看了一下,文章讲的还是很详细的.不过这篇文章应该是.n ...

  8. Leetcode 482.密钥格式化

    密钥格式化 给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号).N 个 '-' 将字符串分成了 N+1 组.给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符 ...

  9. PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述

    本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章 execute_ex 我们来看看执行一个简单的脚本 test.p ...

  10. hibernate延迟加载之get和load的区别

    在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对 ...