代码随想录算法训练营第三天|203(移除链表元素),707(设计链表),206(反转链表)

链表

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

这三道题都可以用单链表来解决。

这里规定自己必须用dummyHead的方法来做链表题。题中没规定head则只声明一个dummyHead,题中有head,则声明dummyHead指向它,并在最后返回之前将head=dummyHead.next。在实际查询的过程中,需要new一个探子curr = dummyHead,让它去不断搜索。

链表难点在于:根据需要的不同操作找到对应的节点。这里假设链表index从0开始。

例如删除index下标为a的节点x0,我们需要找到下标为a-1的节点y0。然后通过y0.next = y0.next.next来删除x0节点。

而查询index下标为a的节点x0,我们就需要找到其本身。

从dummyHead开始到index为a需要的步数为a步,也就是a次循环。到index为a-1的节点自然只需要a-1步

点击查看代码
        for(int i = 0;i<=index;i++)
        {
            // 从 dummyHead 到 index节点处
            // 即可以查询
            currNode = currNode.next;
        }
        for(int i = 0;i<index;i++)
        {
            // 从 dummyHead 到 index 前一个节点处
            // 即可以删除
            currNode = currNode.next;
        }

根据需要,有时也可以为链表维护一个Length变量。

反转链表的思路:以两个节点为一组依次反转,采用双指针思想,一个pre指针表示组中前一个节点,curr表示后一个节点。每次反转后一次后移,比较重要的是停止条件,停止条件是curr为null。因为curr到最后一个节点时,还没进行最后一次反转,所以用curr.next为null作为停止条件,会导致最后差一点没反转。最终则是返回pre作为反转链表的新头部。

点击查看代码
public class Solution {
    public ListNode ReverseList(ListNode head) {
        ListNode pre = null;
        ListNode curr = head;
        ListNode temp;
        
        while(curr!=null){
            temp = curr.next;
            curr.next = pre;

            pre = curr;
            curr = temp;
        }

        return pre;
    }
}
posted @ 2024-05-24 12:23  sakilohale  阅读(170)  评论(0编辑  收藏  举报