删除链表中的元素


删除链表中等于给定值 val 的所有元素。 示例 给定: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6 返回: 1 --> 2 --> 3 --> 4 --> 5 解答: ``` ListNode* removeElements(ListNode* head, int val) { ListNode* preHead = new ListNode(-1); ListNode* cur = preHead; while (head) { if (head->val != val) { auto item = new ListNode(head->val); cur->next = item; cur = item; } head = head->next; } return preHead->next; } ``` 它山之石 ``` ListNode* removeElements(ListNode* head, int val) { if (!head) return head; ListNode* h = head; while (h && h->next) { if (h->next->val == val) { ListNode* temp = h->next; h->next = h->next->next; delete temp; } else h = h->next; } if (head->val == val) head = head->next; return head; } ```

删除链表中的节点


请编写一个函数,使其可以删除某个链表中给定的(非末尾的)节点,您将只被给予要求被删除的节点。 比如:假设该链表为 1 -> 2 -> 3 -> 4 ,给定您的为该链表中值为 3 的第三个节点,那么在调用了您的函数之后,该链表则应变成 1 -> 2 -> 4 。 ``` void deleteNode(ListNode* node) { auto t = node->next; node->next = t->next; node->val = t->val; } ```

删除排序链表中的重复元素


给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例1 ``` 输入: 1->1->2 输出: 1->2 ``` 示例2 ``` 输入: 1->1->2->3->3 输出: 1->2->3 ``` 解答: ``` ListNode* deleteDuplicates(ListNode* head) { if (!head) return nullptr; auto next = head->next; while (next && next->val == head->val) { next = next->next; } head->next = deleteDuplicates(next); return head; } ```

反转链表


反转一个单链表。 例如: 输入`[6,7,8]` 输出`[8,7,6]` ``` ListNode* reverseList(ListNode* head) { if (!head) return nullptr; vector collection; ListNode* out = nullptr; while (head) { collection.push_back(head); head = head->next; } auto iter = collection.begin(); do { auto prev = new ListNode((*iter)->val); prev->next = out; out = prev; iter++; } while (iter != collection.end()); return out; } ```

合并两个有序链表


将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: ``` 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 ``` 解答: ``` ListNode * mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1 && !l2) { return nullptr; } if (!l1 || l1 && l2 && l1->val > l2->val) { swap(l1, l2); } l1->next = mergeTwoLists(l2, l1->next); return l1; } ```