链表简单题
| void deleteNode(struct ListNode *node) { |
| |
| node->val = node->next->val; |
| node->next = node->next->next; |
| } |
| int getDecimalValue(struct ListNode *head) { |
| struct ListNode *cur = head; |
| int res = 0; |
| while (cur != NULL) { |
| res <<= 1; |
| res += cur->val; |
| cur = cur->next; |
| } |
| return res; |
| } |
| int kthToLast(struct ListNode *head, int k) { |
| struct ListNode *fast = head; |
| struct ListNode *slow = head; |
| |
| while (k > 0) { |
| fast = fast->next; |
| k--; |
| } |
| |
| while (fast != NULL) { |
| fast = fast->next; |
| slow = slow->next; |
| } |
| return slow->val; |
| } |
| |
| struct ListNode *reverseList(struct ListNode *head) { |
| struct ListNode *pre = NULL; |
| struct ListNode *next; |
| struct ListNode *cur = head; |
| |
| |
| while (cur != NULL) { |
| next = cur->next; |
| cur->next = pre; |
| pre = cur; |
| cur = next; |
| } |
| return pre; |
| } |
| |
| struct ListNode *reverseList(struct ListNode *head) { |
| |
| if (head == NULL || head->next == NULL) return head; |
| |
| struct ListNode *newHead = reverseList(head->next); |
| head->next->next = head; |
| head->next = NULL; |
| return newHead; |
| } |
| |
| struct ListNode *middleNode(struct ListNode *head) { |
| struct ListNode *fast = head; |
| struct ListNode *slow = head; |
| |
| while (fast != NULL && fast->next != NULL) { |
| fast = fast->next->next; |
| slow = slow->next; |
| } |
| return slow; |
| } |
| |
| struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { |
| int len1 = 0, len2 = 0; |
| struct ListNode *p = headA, *q = headB; |
| |
| while (p != NULL) { |
| len1++; |
| p = p->next; |
| } |
| while (q != NULL) { |
| len2++; |
| q = q->next; |
| } |
| |
| |
| p = headA; |
| q = headB; |
| if (len1 > len2) |
| for (int i = 0; i < len1 ### len2; ++i) |
| p = p->next; |
| else |
| for (int i = 0; i < len2 ### len1; ++i) |
| q = q->next; |
| |
| while (p != NULL) { |
| if (p == q)return p; |
| p = p->next; |
| q = q->next; |
| } |
| return NULL; |
| } |
| |
| struct ListNode *removeDuplicateNodes(struct ListNode *head) { |
| if (head == NULL || head->next == NULL) return head; |
| int hash[20001]; |
| memset(hash, 0, sizeof(hash)); |
| struct ListNode *p = head; |
| hash[head->val] = 1; |
| |
| |
| while (p != NULL && p->next != NULL) { |
| if (hash[p->next->val] == 0) { |
| |
| hash[p->next->val] = 1; |
| |
| p = p->next; |
| } else { |
| |
| p->next = p->next->next; |
| |
| } |
| } |
| return head; |
| } |
| |
| |
| struct ListNode *removeNode(struct ListNode *head, int k) { |
| struct ListNode *headNode = (struct ListNode *) malloc(sizeof(struct ListNode)); |
| headNode->next = head; |
| struct ListNode *p = headNode; |
| |
| while (p != NULL && p->next != NULL) { |
| if (p->next->val == k) { |
| |
| p->next = p->next->next; |
| |
| } else { |
| |
| p = p->next; |
| } |
| } |
| |
| return headNode->next; |
| } |
| |
| struct ListNode *removeDuplicateNodes(struct ListNode *head) { |
| if (head == NULL || head->next == NULL) return head; |
| struct ListNode *cur = head; |
| while (cur != NULL && cur->next != NULL) { |
| |
| cur->next = removeNode(cur->next, cur->val); |
| cur = cur->next; |
| } |
| return head; |
| } |
| |
| struct ListNode *mergeTwoLists(struct ListNode *list1, struct ListNode *list2) { |
| struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode)); |
| head->next = NULL; |
| struct ListNode *p = head; |
| |
| while (list1 != NULL && list2 != NULL) { |
| if (list1->val < list2->val) { |
| p->next = list1; |
| list1 = list1->next; |
| } else { |
| p->next = list2; |
| list2 = list2->next; |
| } |
| p = p->next; |
| } |
| |
| if (list1 != NULL) p->next = list1; |
| if (list2 != NULL) p->next = list2; |
| |
| return head->next; |
| } |
| |
| struct ListNode *mergeTwoLists(struct ListNode *list1, struct ListNode *list2) { |
| |
| if (list1 == NULL) return list2; |
| if (list2 == NULL) return list1; |
| |
| if (list1->val < list2->val) { |
| list1->next = mergeTwoLists(list1->next, list2); |
| return list1; |
| } else { |
| list2->next = mergeTwoLists(list1, list2->next); |
| return list2; |
| } |
| } |
| |
| struct ListNode *findMid(struct ListNode *head) { |
| struct ListNode *slow = head; |
| struct ListNode *fast = head; |
| while (fast != NULL && fast->next != NULL) { |
| fast = fast->next->next; |
| slow = slow->next; |
| } |
| return slow; |
| } |
| |
| |
| struct ListNode *reverseList(struct ListNode *head) { |
| struct ListNode *pre = NULL; |
| struct ListNode *cur = head; |
| struct ListNode *next; |
| while (cur != NULL) { |
| next = cur->next; |
| cur->next = pre; |
| pre = cur; |
| cur = next; |
| } |
| return pre; |
| } |
| |
| |
| bool isPalindrome(struct ListNode *head) { |
| struct ListNode *mid = findMid(head); |
| mid = reverseList(mid); |
| |
| struct ListNode *p = head; |
| struct ListNode *q = mid; |
| while (q != NULL) { |
| if (p->val != q->val) return false; |
| p = p->next; |
| q = q->next; |
| } |
| return true; |
| } |
| |
| struct ListNode *removeElements(struct ListNode *head, int val) { |
| struct ListNode *headNode = (struct ListNode *) malloc(sizeof(struct ListNode)); |
| headNode->next = head; |
| struct ListNode *p = headNode; |
| |
| while (p != NULL && p->next != NULL) { |
| if (p->next->val == val) { |
| |
| p->next = p->next->next; |
| |
| } else { |
| |
| p = p->next; |
| } |
| } |
| |
| return headNode->next; |
| } |
| struct ListNode *deleteDuplicates(struct ListNode *head) { |
| if (head == NULL || head->next == NULL) return head; |
| struct ListNode *dummyHead = (struct ListNode *) malloc(sizeof(struct ListNode)); |
| dummyHead->next = head; |
| struct ListNode *cur = head; |
| while (cur != NULL) { |
| while (cur->next != NULL && cur->val == cur->next->val) { |
| |
| cur->next = cur->next->next; |
| } |
| cur = cur->next; |
| } |
| |
| return dummyHead->next; |
| } |
| bool hasCycle(struct ListNode *head) { |
| if (head == NULL || head->next == NULL) return false; |
| |
| struct ListNode *slow = head; |
| struct ListNode *fast = head->next; |
| |
| while (fast != NULL && fast->next != NULL) { |
| if (slow == fast)return true; |
| slow = slow->next; |
| fast = fast->next->next; |
| } |
| return false; |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/17070230.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步