给定数组:[1,2,3,4,5,6,7,8].转成链表结构
第一种方法,正序循环数组:
1.设置哨兵节点
2. 把哨兵节点sentineNode赋值给一个临时节点tempNode.循环数据1 进来的时候,建立一个新的节点newNode,赋值为1.
3. 需要注意的是,哨兵节点sentineNode现在是整个链表的head节点.然后我们把临时节点指向newNode.
我们遵循上面的步骤即可。
代码如下:
@Data
public class Node {
int val;
Node next;
public Node(int x) { val = x; }
}
public Node changeArrayToNode(int[] arr) {
if(arr == null || arr.length <= 0){return null;}
Node sentineNode = new Node(0); //建立哨兵节点
Node tempNode = sentineNode; //tempNode变量指向哨兵节点
for(int i = 0; i < arr.length; i++) {
Node newNode = new Node(arr[i]);
tempNode.next = newNode; //临时节点‘后继指针’指向新节点
tempNode = newNode; //把新节点赋给临时变量tempNode
}
return sentineNode.next;
}
时间复杂度与空间复杂度都是O(n)
第二种方法:逆序遍历数组,从链表的未节点开始赋值
逆序遍历和正序遍历原理是一样的,这里加深理解。
逆序遍历进来第一个值是8,我们创建一个新节点NewNode,并且让headNode变量指向NewNode; 进来第一个数据7的时候,我们把7的newNode节点的‘后继指针’指向刚才的headNode节点。然后再把headNode变量指向7的newNode节点。依次循环。
代码如下:
public Node changeArrayToNode2(int[] arr) {
if(arr == null || arr.length <= 0){return null;}
Node headNode = null;
for(int i = arr.length - 1; i >= 0; i--) {
Node newNode = new Node(arr[i]);
newNode.next = headNode;
headNode = newNode;
}
return headNode;
}
总之,我们在链表问题的时候,要多想一下临时节点与哨兵节点。