力扣 203移除链表元素 707设计链表 206反转链表

题目链接:

203. 移除链表元素 - 力扣(LeetCode)

707. 设计链表 - 力扣(LeetCode)

206. 反转链表 - 力扣(LeetCode)

一、什么是链表

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

链表的入口节点称为链表的头结点也就是head。

单链表:

力扣 203移除链表元素 707设计链表 206反转链表_第1张图片

双链表:

力扣 203移除链表元素 707设计链表 206反转链表_第2张图片

循环链表:

力扣 203移除链表元素 707设计链表 206反转链表_第3张图片

 定义链表:
public class ListNode {
    // 结点的值
    int val;

    // 下一个结点
    ListNode next;

    // 节点的构造函数(无参)
    public ListNode() {
    }

    // 节点的构造函数(有一个参数)
    public ListNode(int val) {
        this.val = val;
    }

    // 节点的构造函数(有两个参数)
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

 删除节点:

力扣 203移除链表元素 707设计链表 206反转链表_第4张图片

添加节点:

力扣 203移除链表元素 707设计链表 206反转链表_第5张图片 

 

 

二、移除链表元素

在单链表中移除头结点 和 移除其他节点的操作方式是不一样,需要单独写一段逻辑来处理移除头结点的情况。头结点的移除,将头结点向后移动一位就可以,这样就从链表中移除了一个头结点。

可以设置一个虚拟头结点,这样原链表的所有节点就都可以按照统一的方式进行移除了。

力扣 203移除链表元素 707设计链表 206反转链表_第6张图片

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //创建一个虚拟头结点
        ListNode dummyNode=new ListNode(val-1);
        dummyNode.next=head;
        ListNode prev=dummyNode;
        //确保当前结点后还有结点
        while(prev.next!=null){
            if(prev.next.val==val){
                prev.next=prev.next.next;
            }else{
                prev=prev.next;
            }
        }
        return dummyNode.next;
    }
}

 还有递归的方法,不太理解。掌握设置虚拟头结点的方法和删除头结点时另作考虑的方法就行了。

三、设计链表 

(⊙﹏⊙)

直接上代码吧

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 cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur.next;
        }
        return cur.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;
        }
        index = Math.max(0, index);
        size++;
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        ListNode toAdd = new ListNode(val);
        toAdd.next = pred.next;
        pred.next = toAdd;
    }

    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        size--;
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        pred.next = pred.next.next;
    }
}

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

四、反转链表

看着很简单。奈何不能写对。

看了官方的题解,迭代的方法,没绕明白。

评论里的题解发现了个大神,有动态演示!!太给力了!

力扣

递归的方法,算了。

看迭代。

力扣 203移除链表元素 707设计链表 206反转链表_第7张图片

 

迭代的代码如下:

class Solution {
	public ListNode reverseList(ListNode head) {
		//申请节点,pre和 cur,pre指向null
		ListNode pre = null;
		ListNode cur = head;
		ListNode tmp = null;
		while(cur!=null) {
			//记录当前节点的下一个节点
			tmp = cur.next;
			//然后将当前节点指向pre
			cur.next = pre;
			//pre和cur节点都前进一位
			pre = cur;
			cur = tmp;
		}
		return pre;
	}
}

心得

代码随想录算法训练营第三天,链表。

移除链表元素掌握了两种方法,设置虚拟头结点的方法很好。

反转链表的双指针迭代最开始没明白,看了演示了解了。

设计链表嘛,嗯,就那样。

坚持了。仍需思考。

你可能感兴趣的:(leetcode,链表,算法,java)