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; } };
给定的是要删除的节点的指针,要删除该节点,由于无法获取前面节点的next,无法通过修改该next指向后面的节点。
这里将该节点的值用其后面节点的值替换,再删除后面的节点,达到等效的作用。
2.获取中间节点
描述:给定一个带有头结点 head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
class solution{ public: ListNode *getMiddleNode(ListNode *head){ ListNode *fast=head; ListNode *slow=head; while(fast != NULL && fast->next != NULL){ fast=fast->next->next; slow=slow->next; } return slow; } }
快慢指针法。
另一种是将节点指针输入到数组,再利用数组的随机访问特性。而随机访问正是链表的弱点。
3.反转链表
class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *next=NULL; ListNode *new_head=NULL; while(head){ next=head->next; head->next=new_head; new_head=head; head=next; } return new_head; } };