(1)剑指Offer 从尾到头打印链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> printListReversingly(ListNode* head) {
vector<int> res;
while(head)
{
res.push_back(head->val);
head = head->next;
}
reverse(res.begin(), res.end());
//return vector<int>(res.rbegin(), res.rend());
return res;
}
};
(2)剑指Offer 在O(1)时间删除链表结点(假设链表一定存在,并且该节点一定不是尾节点。)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};
(3)剑指Offer 链表中倒数第k个节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* findKthToTail(ListNode* head, int k) {
int n = 0;
for (ListNode* p = head; p; p = p->next) n ++ ;
if(k > n) return NULL;
ListNode* p = head;
for (int i = 0; i < n - k; i ++ ) p = p->next;
return p;
}
};
(4)剑指Offer, 语法题, Hulu面试题 反转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head || !head->next) return head;
ListNode* a = head, *b = a->next;
while(b)
{
ListNode *c = b->next;
b->next = a;
a = b;
b = c;
}
head->next = NULL;
return a;
}
};
(5)剑指Offer 合并两个排序的链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(-1);
ListNode* tail = dummy;
while(l1 && l2)
{
if(l1->val <= l2->val)
{
tail = tail->next = l1;
l1 = l1->next;
}
else
{
tail = tail->next = l2;
l2 = l2->next;
}
}
if(l1) tail->next = l1;
if(l2) tail->next = l2;
return dummy->next;
}
};