题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
题目来源:力扣(LeetCode)
思路分析:
反转即是头节点指向null,原来头结点的下一个节点指向头节点,依次类推
如果头节点直接指向null的话会导致后面的节点直接丢失,所以要用一个节点来代替头结点做反转,最后返回值返回该节点作为头结点。
利用迭代:使用双指针实现
初始化一个指针cur指向头节点,另一个指针pre指向null,
每次循环需要一个临时节点temp获取当前节点的下一个节点,保证连续,
第一次循环,temp获取头节点的下一个节点:temp=cur.next
获取完之后头节点要变成尾节点即cur.next = pre,
这时候指向null的pre指针需要指向头节点(原因是原头结点要被第2个节点指向)即pre = cur 原先指向头结点的cur指针就需要指向我们获取的第2个节点,而第二个节点已经被我们用临时节点取出来了,即cur=temp.
如此迭代,当cur指向null时也就是到了原先的尾节点就跳出循环,返回pre。
代码:
//单向链表节点
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
/**
* 反转链表的方法
* @param head 链表的头节点
* @return ListNode 一个反转后的头结点
*/
public ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode pre = null;
while(cur!=null){
//保存当前节点下一个节点
ListNode temp = cur.next;
//指向前一个节点(头结点指向null)
cur.next = pre;
pre = cur;
cur = temp;
}
//将反转后的链表头节点返回
return pre;
}
测试
public static void main(String[] args) {
ListNode ln1 = new ListNode(1);
ListNode ln2 = new ListNode(2);
ListNode ln3 = new ListNode(3);
ln1.next = ln2;
ln2.next = ln3;
ln3.next = null;
Solution s = new Solution();
ListNode head= s.reverseList(ln1);
ListNode temp = head;//不再对head使用可以直接用head来输出 使用建议先获取出以防找不到头节点避免了重新获取
while (temp!=null){
System.out.print(temp.val+" ");
temp = temp.next;
}
}
//运行结果 3 2 1