移除链表元素
本题解析:删除链表的时候分两步,第一步删除头节点的值,第二步删除非头节点的值;
class Solution {
public ListNode removeElements(ListNode head, int val) {
//删除头节点
while(head != null && head.val == val){
head = head.next;
}
//删除非头结点
ListNode cur = head;
while(cur != null && cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return head;
}
}
设计链表
题目解析:可以尝试在头部添加一个虚拟节点,后面的步骤会容易很多
class ListNode {
int val;
ListNode next;
ListNode(){}
ListNode(int val) {
this.val=val;
}
}
class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
//初始化链表
size = 0;
head = new ListNode(0);
}
public int get(int index) {
if(index < 0 || index >= size){
return -1;
}
ListNode currentNode = head;
for(int i = 0 ; i <= index ; i ++){
currentNode = currentNode.next;
}
return currentNode.val;
}
public void addAtHead(int val) {
addAtIndex(0,val);
}
public void addAtTail(int val) {
addAtIndex(size,val);
}
public void addAtIndex(int index, int val) {
if(index > size){
return;
}
if(index < 0){
index = 0;
}
size ++;
ListNode pre = head;
for(int i = 0 ; i < index ; i ++){
pre = pre.next;
}
ListNode node = new ListNode(val);
node.next = pre.next;
pre.next = node;
}
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) {
return;
}
size--;
if (index == 0) {
head = head.next;
return;
}
ListNode pre = head;
for(int i = 0 ; i < index ; i ++){
pre = pre.next;
}
pre.next = pre.next.next;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
反转链表
题目解析:使用回溯法对链表进行反转,注意的一点是要先存储链表的下一节点,因为改变next指针之后需要进行一下节点的反转
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null,head);
}
public ListNode reverse(ListNode pre,ListNode cur){
if(cur == null){
return pre;
}
ListNode temp = cur.next;
cur.next = pre;
return reverse(cur,temp);
}
}