203. 移除链表元素
原地移除
struct ListNode* removeElements(struct ListNode* head, int val) {
struct ListNode *tmp = NULL, *cur;
while (head != NULL && head->val == val) {
tmp = head;
head = head->next;
free(tmp);
}
cur = head;
while (cur != NULL && cur->next != NULL) {
if (cur->next->val == val) {
tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
} else {
cur = cur->next;
}
}
return head;
}
单独考虑头节点
添加空的头节点
// 设置虚头节点
struct ListNode *new = NULL, *tmp = NULL, *cur = NULL;
new = (struct ListNode *)malloc(sizeof(struct ListNode));
new->next = head;
cur = new;
while (cur->next != NULL) {
if (cur->next->val == val) {
tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
} else {
cur = cur->next;
}
}
return new->next;
707. 设计链表
typedef struct MyLinkedList {
int val;
struct MyLinkedList* next;
} MyLinkedList;
MyLinkedList* myLinkedListCreate() {
struct MyLinkedList* head = (struct MyLinkedList *)malloc(sizeof(struct MyLinkedList));
head->next = NULL;
return head;
}
int myLinkedListGet(MyLinkedList* obj, int index) {
int i = 0;
while (obj->next != NULL) { // 这里是引入头节点的链表, 所以`ojb->next`表示链表第一个元素
obj = obj->next;
if (i++ == index) {
return obj->val;
}
}
return -1;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
struct MyLinkedList* tmp =
(struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));
tmp->val = val;
tmp->next = obj->next;
obj->next = tmp;
return;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
struct MyLinkedList *tmp = NULL, *cur = NULL;
cur = obj;
while (cur->next != NULL) cur = cur->next;
tmp = (struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));
tmp->val = val;
tmp->next = NULL;
cur->next = tmp;
return;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
int i = 0;
struct MyLinkedList *tmp = NULL, *cur = NULL;
cur = obj;
while (cur->next != NULL) {
if (i++ == index) {
tmp = (struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));
tmp->val = val;
tmp->next = cur->next;
cur->next = tmp;
break;
}
cur = cur->next;
}
if (i == index) {
tmp = (struct MyLinkedList*)malloc(sizeof(struct MyLinkedList));
tmp->val = val;
tmp->next = NULL;
cur->next = tmp;
}
return;
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
int i = 0;
struct MyLinkedList *tmp = NULL, *cur = NULL;
cur = obj;
while (cur->next != NULL) {
if (i++ == index) {
tmp = cur->next;
cur->next = tmp->next;
free(tmp);
break;
}
cur = cur->next;
}
return;
}
void myLinkedListFree(MyLinkedList* obj) {
struct MyLinkedList* tmp = NULL;
while (obj != NULL) { // 头节点也要删除
tmp = obj;
obj = obj->next;
free(tmp);
}
}
/**
* Your MyLinkedList struct will be instantiated and called as such:
* MyLinkedList* obj = myLinkedListCreate();
* int param_1 = myLinkedListGet(obj, index);
* myLinkedListAddAtHead(obj, val);
* myLinkedListAddAtTail(obj, val);
* myLinkedListAddAtIndex(obj, index, val);
* myLinkedListDeleteAtIndex(obj, index);
* myLinkedListFree(obj);
*/
206. 反转链表
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *tmp = NULL, *cur = NULL, *pre = NULL;
cur = head;
while (cur != NULL) {
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
注意三个节点的移动