1. 203.移除链表
这道题分别用两种方法做了一下(直接移除和引入虚拟头结点后移除),单从这道题暂时还感觉不出虚拟头结点的优越性,但后面设计链表的题就发现虚拟头结点是真的好用
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeElements(struct ListNode* head, int val) {
#if 0
struct ListNode* tmp;
while(head != NULL && head->val == val)
{
tmp = head;
head = head->next;
free(tmp);
}
struct ListNode* 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;
#else
typedef struct ListNode ListNode;
ListNode *thead;
thead = (ListNode *)malloc(sizeof(ListNode));
thead->next = head;
ListNode *cur = thead;
while(cur->next != NULL)
{
if(cur->next->val == val)
{
ListNode *tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
}
else
{
cur = cur->next;
}
}
head = thead->next;
free(thead);
return head;
#endif
}
2. 707.设计链表
关键的点在于插入/删除时cur指针怎么移动,是先删除cur->next还是先保存cur->next。
这道题有一个点还没有搞清楚,第89行我最开始写的是cur->next = cur->next->next,结果运行报错了invalid use of undefined type ‘struct MyLinkedList’, 替换成cur->next = tmp->next才能编过。暂时还没有想清楚为什么会这样。
typedef struct {
int val;
struct MyLinkedList *next;
} MyLinkedList;
MyLinkedList* myLinkedListCreate() {
MyLinkedList *head = (MyLinkedList *)malloc(sizeof(MyLinkedList));
head->next = NULL;
return head;
}
int myLinkedListGet(MyLinkedList* obj, int index) {
MyLinkedList *cur = obj->next;
for(int i = 0; cur != NULL; i++)
{
if(i == index)
return cur->val;
else
cur = cur->next;
}
return -1;
}
void myLinkedListAddAtHead(MyLinkedList* obj, int val) {
MyLinkedList *nhead = (MyLinkedList *)malloc(sizeof(MyLinkedList));
nhead->val = val;
nhead->next = obj->next;
obj->next = nhead;
}
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
MyLinkedList *cur = obj;
while(cur->next != NULL)
{
cur = cur->next;
}
MyLinkedList *ntail = (MyLinkedList *)malloc(sizeof(MyLinkedList));
ntail->val = val;
ntail->next = NULL;
cur->next = ntail;
}
void myLinkedListAddAtIndex(MyLinkedList* obj, int index, int val) {
if(index == 0){
myLinkedListAddAtHead(obj, val);
return;
}
MyLinkedList *cur = obj->next;
for(int i = 1; cur!=NULL; i++)
{
if(i == index)
{
MyLinkedList *nnode = (MyLinkedList *)malloc(sizeof(MyLinkedList));
nnode->val = val;
nnode->next = cur->next;
cur->next = nnode;
return;
}
else
{
cur = cur->next;
}
}
}
void myLinkedListDeleteAtIndex(MyLinkedList* obj, int index) {
if(index == 0)
{
MyLinkedList *tmp = obj->next;
if (tmp != NULL)
{
obj->next = tmp->next;
free(tmp);
}
}
MyLinkedList *cur = obj->next;
for (int i = 1 ;cur != NULL && cur->next != NULL; i++){
if (i == index)
{
MyLinkedList *tmp = cur->next;
if (tmp != NULL)
{
cur->next = tmp->next;
free(tmp);
}
return;
}
else{
cur = cur->next;
}
}
}
void myLinkedListFree(MyLinkedList* obj) {
while(obj!=NULL)
{
MyLinkedList *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);
*/
3. 206.反转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* tmp;
struct ListNode* pre = NULL;
while(head)
{
tmp = head->next;
head->next = pre;
pre = head;
head = tmp;
}
return pre;
}