题目
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。 addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。 addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。 deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
答案
题1
class Solution {
public :
ListNode* removeElements ( ListNode* head, int val) {
ListNode* dummyHead = new ListNode ( 0 ) ;
dummyHead-> next = head;
ListNode* cur = dummyHead;
while ( cur-> next != NULL ) {
if ( cur-> next-> val == val) {
ListNode* tmp = cur-> next;
cur-> next = cur-> next-> next;
delete tmp;
} else {
cur = cur-> next;
}
}
head = dummyHead-> next;
delete dummyHead;
return head;
}
} ;
题2
class MyLinkedList {
public :
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode ( int val) : val ( val) , next ( nullptr ) { }
} ;
MyLinkedList ( ) {
_dummyHead = new LinkedNode ( 0 ) ;
_size = 0 ;
}
int get ( int index) {
if ( index > ( _size - 1 ) || index < 0 ) {
return - 1 ;
}
LinkedNode* cur = _dummyHead-> next;
while ( index-- ) {
cur = cur-> next;
}
return cur-> val;
}
void addAtHead ( int val) {
LinkedNode* newNode = new LinkedNode ( val) ;
newNode-> next = _dummyHead-> next;
_dummyHead-> next = newNode;
_size++ ;
}
void addAtTail ( int val) {
LinkedNode* newNode = new LinkedNode ( val) ;
LinkedNode* cur = _dummyHead;
while ( cur-> next != nullptr ) {
cur = cur-> next;
}
cur-> next = newNode;
_size++ ;
}
void addAtIndex ( int index, int val) {
if ( index > _size) return ;
if ( index < 0 ) index = 0 ;
LinkedNode* newNode = new LinkedNode ( val) ;
LinkedNode* cur = _dummyHead;
while ( index-- ) {
cur = cur-> next;
}
newNode-> next = cur-> next;
cur-> next = newNode;
_size++ ;
}
void deleteAtIndex ( int index) {
if ( index >= _size || index < 0 ) {
return ;
}
LinkedNode* cur = _dummyHead;
while ( index-- ) {
cur = cur -> next;
}
LinkedNode* tmp = cur-> next;
cur-> next = cur-> next-> next;
delete tmp;
_size-- ;
}
void printLinkedList ( ) {
LinkedNode* cur = _dummyHead;
while ( cur-> next != nullptr ) {
cout << cur-> next-> val << " " ;
cur = cur-> next;
}
cout << endl;
}
private :
int _size;
LinkedNode* _dummyHead;
} ;
题3
class Solution {
public :
ListNode* reverse ( ListNode* pre, ListNode* cur) {
if ( cur == NULL ) return pre;
ListNode* temp = cur-> next;
cur-> next = pre;
return reverse ( cur, temp) ;
}
ListNode* reverseList ( ListNode* head) {
return reverse ( NULL , head) ;
}
} ;
总结
思路